httpwebrequest中的c#web浏览器cookie

httpwebrequest中的c#web浏览器cookie,c#,httpwebrequest,webbrowser-control,C#,Httpwebrequest,Webbrowser Control,我有一个webbrowser控件,可以加载页面。 然后我点击一个按钮调用此方法: public void get(Uri myUri) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri); CookieContainer cookieJar = new CookieContainer(); cookieJar.SetCookies(webBrowser1.D

我有一个webbrowser控件,可以加载页面。 然后我点击一个按钮调用此方法:

public void get(Uri myUri)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
        CookieContainer cookieJar = new CookieContainer();
        cookieJar.SetCookies(webBrowser1.Document.Url,webBrowser1.Document.Cookie.Replace(';', ','));
        request.CookieContainer = cookieJar;


        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        int cookieCount = cookieJar.Count;

        Stream receiveStream = response.GetResponseStream();
        StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);

        txt.Text = readStream.ReadToEnd();


            txt2.Text = cookieCount.ToString();


    }
从cookieCount int可以看出,如果我在登录web浏览器控件的页面之前调用该方法,我将得到6个cookie,而在登录之后我将得到7个cookie。 然而,即使使用cookies,我得到的响应也与我没有登录时的响应相同。 所以我猜cookies不是随请求一起发送的


谢谢

每次调用此方法时,您都在重新创建CookieContainer,您需要在所有请求中使用相同的CookieContainer

您可以使用此代码来处理您的请求:

      static CookieContainer cookies = new CookieContainer();

        static HttpWebRequest GetNewRequest(string targetUrl, CookieContainer SessionCookieContainer)
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUrl);
            request.CookieContainer = SessionCookieContainer;
            request.AllowAutoRedirect = false;
            return request;
        }

        public static HttpWebResponse MakeRequest(HttpWebRequest request, CookieContainer SessionCookieContainer, Dictionary<string, string> parameters = null)
        {


            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5Accept: */*";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.CookieContainer = SessionCookieContainer;
            request.AllowAutoRedirect = false;

            if (parameters != null)
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                string postData = "";
                foreach (KeyValuePair<String, String> parametro in parameters)
                {
                    if (postData.Length == 0)
                    {
                        postData += String.Format("{0}={1}", parametro.Key, parametro.Value);
                    }
                    else
                    {
                        postData += String.Format("&{0}={1}", parametro.Key, parametro.Value);
                    }

                }
                byte[] postBuffer = UTF8Encoding.UTF8.GetBytes(postData);
                using (Stream postStream = request.GetRequestStream())
                {
                    postStream.Write(postBuffer, 0, postBuffer.Length);
                }
            }
            else
            {
                request.Method = "GET";
            }


            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            SessionCookieContainer.Add(response.Cookies);


            while (response.StatusCode == HttpStatusCode.Found)
            {
                response.Close();
                request = GetNewRequest(response.Headers["Location"], SessionCookieContainer);
                response = (HttpWebResponse)request.GetResponse();
                SessionCookieContainer.Add(response.Cookies);
            }


            return response;
        }
静态CookieContainer cookies=新CookieContainer();
静态HttpWebRequest GetNewRequest(字符串targetUrl,CookieContainer会话CookieContainer)
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(targetUrl);
request.CookieContainer=SessionCookieContainer;
request.AllowAutoRedirect=false;
返回请求;
}
公共静态HttpWebResponse MakeRequest(HttpWebRequest请求,CookieContainer会话CookieContainer,字典参数=null)
{
request.UserAgent=“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/536.5(KHTML,类似Gecko)Chrome/19.0.1084.52 Safari/536.5Accept://*”;
request.Accept=“text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”;
request.CookieContainer=SessionCookieContainer;
request.AllowAutoRedirect=false;
if(参数!=null)
{
request.Method=“POST”;
request.ContentType=“application/x-www-form-urlencoded”;
字符串postData=“”;
foreach(参数中的KeyValuePair参数)
{
if(postData.Length==0)
{
postData+=String.Format(“{0}={1}”,parametro.Key,parametro.Value);
}
其他的
{
postData+=String.Format(&{0}={1}),parametro.Key,parametro.Value);
}
}
byte[]postBuffer=UTF8Encoding.UTF8.GetBytes(postData);
使用(Stream postStream=request.GetRequestStream())
{
写(postBuffer,0,postBuffer.Length);
}
}
其他的
{
request.Method=“GET”;
}
HttpWebResponse=request.GetResponse()作为HttpWebResponse;
sessionokiecontainer.Add(response.Cookies);
while(response.StatusCode==HttpStatusCode.Found)
{
response.Close();
request=GetNewRequest(response.Headers[“Location”],sessionokiecontainer);
response=(HttpWebResponse)request.GetResponse();
sessionokiecontainer.Add(response.Cookies);
}
返回响应;
}
并请求一页

 HttpWebRequest request = GetNewRequest("http://www.elitepvpers.com/forum/login.php?do=login", cookies);
 Dictionary<string,string> parameters = new Dictionary<string,string>{{"your params","as key value"};


            HttpWebResponse response = MakeRequest(request, cookies, parameters);
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                if(!reader.EndOfStream)
                {
                    Console.Write(reader.ReadToEnd());
                }
            }
HttpWebRequest request=GetNewRequest(“http://www.elitepvpers.com/forum/login.php?do=login“、饼干);
字典参数=新字典{{“您的参数”,“作为键值”};
HttpWebResponse-response=MakeRequest(请求、cookie、参数);
使用(StreamReader=newstreamreader(response.GetResponseStream())
{
if(!reader.EndOfStream)
{
Console.Write(reader.ReadToEnd());
}
}

匹配会话时,您的web服务器可能会考虑Cookie之外的其他内容。举几个例子:
用户代理
授权
接受语言

由于
WebBrowser
控件和
WebRequest
不共享会话,因此您需要复制
WebBrowser
会话中的所有标题。这将是一件很难做到的事情,因为您需要以类似的方式拦截
WebBrowser
流量

一个更可行的解决方案可能是通过使用like等来与
WebBrowser
保持相同的会话,而不是
WebRequest
。这是可行的,因为
WebBrowser
在幕后使用
UrlMon

我最近回答了一些相关问题:


谢谢!我似乎无法正确理解请求页面的代码语法。请用一个方法或其他东西包装一下,好吗?我对c#非常陌生。在这里,您可以看到一个执行此请求的示例应用程序