时间:2019-03-17 标签:c#web浏览器cookieshttpwebrequest

标签 c# httpwebrequest webbrowser-control

我有一个加载页面的网络浏览器控件。 然后我点击一个按钮来调用这个方法:

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。 然而,即使使用 cookie,我得到的响应也与我没有登录时一样。 所以我猜测 cookie 没有随请求一起发送?

谢谢!

最佳答案

每次调用此方法时都会重新创建 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;
        }

并请求页面,

 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());
                }
            }

关于时间:2019-03-17 标签:c#web浏览器cookieshttpwebrequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20135267/

相关文章:

c# - 为什么使用 'ICollection<T>' ?

c# - 如何从代码隐藏调用 IF 条件下的确认框?

c# - WebAPI 类的外键关系

python - 如何在uri中传递十六进制值?

c# - 无法从 .Net 应用程序发送发布请求,它适用于 Chrome RESTClient

node.js - Node 套接字在 Twitter 流 filter.json 上挂起

c# - 从其他游戏对象获取 AudioSource

internet-explorer - 在 MSHTML IE8 中修改 DOM 时是否会触发一个事件?

c# - 如何从嵌入式资源加载 HTML/JavaScript 到 winform web 浏览器

c# - 在网络浏览器控件上自动登录