none
【请教】System.Net.Http 使用中的几个问题 RRS feed

  • 问题

  • 上一次在版块内发帖,有关 HttpClient 实现登录,得到了帮助,但由于一些原因,上次是通过HttpWebRequest+HttpWebResponse的组合实现的,现在改用 Http 下相关类型学习重写,碰到了几个问题,希望得到大虾们的帮助。

    问题1:CookieContainer 和 Cookie 两个对象都没有提供类似 Clear 的方法,当我想要清除某网站的 Cookie 时,是不是分配给 HttpClientHandler 一个新构造的 CookieContainer 就算达到目的了?

    问题2:现有一个假设的网络地址 http://www.a.com,通过工具查看发现提交登录的完整地址为 http://www.a.com/logging.php?action=login&cookietime=2592000&loginfield=username&username=123&password=123&loginsubmit=true,之前用 HttpWebRequest 实现登录时,是先获取 new HttpWebRequest("http://www.a.com/logging.php").GetRequestStream(),再将 action=login 到 loginsubmit=true 这部分query以 UTF-8 编码成 byte[],最后通过获取到的 RequestStream.Write 发送给远程 Web。现在改用 HttpClient 想实现登录,看到了 PostAsync(Uri,HttpContent,cancelToken) 方法,但面对很多的 HttpContent 不知道如何选择,不知道 query 的部分如何处理,放到哪里。

    问题3:HttpClient 中要设置“请求头”,是操作 HttpClient.DefaultRequestHeader 吗?比如 HttpClient.DefaultRequestHeaders.AcceptLanguage,具体如何更改其值。

    问题4:通过浏览器跟踪,发现“响应头”中 Content-Type 内容为“text/html”,并没有“charset=xxx”的内容,此时如何获得该页面的编码方式?通过分析 html 文本吗?昨天使用 HttpClient.GetAsync().Content.ReadAsStringAsync() 获取到的页面内,中文部份都是乱码,如何处理?

    问题稍多,希望浏览到的大虾们不吝赐教,谢谢


    不重要的其实最重要

    2014年2月19日 5:50

答案

  • 你好:

    1. 清除Cookie其实只要设置Cookie过期就可以了

    cookie.Expires = DateTime.Now.AddDays(-1);

    2. 尝试一下下面方法中传递键值对看看:

    var baseAddress = new Uri("http://example.com");
    var cookieContainer = new CookieContainer();
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
    {
        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("foo", "bar"),
            new KeyValuePair<string, string>("baz", "bazinga"),
        });
    	
        cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
        var result = client.PostAsync("/test", content).Result;
        result.EnsureSuccessStatusCode();
    }
    

    FormUrlEncodedContent对象默认就是UTF-8编码。

    3. 参考以下:

    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Add("Accept", "text/html, application/xhtml+xml, */*");
    client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
    client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.8,sv-SE;q=0.5,sv;q=0.3");
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    
    // Form Data
    

    4. 参考:

    HttpResponseMessage response = client.GetAsync("http://www.baidu.com").Result;
                HttpResponseHeaders headers = response.Headers;


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年2月20日 4:57
    版主
  • 如果对于浏览器来讲,对于已经过期的Cookie就直接不会发送到服务端。浏览器会对Cookie进行过期检查。

    http://msdn.microsoft.com/en-us/library/aa289495(v=vs.71).aspx

    对于CookieContainer来讲应该也是遵循同样的规则。

    服务器重新将Cookie写回客户端是由服务器端完成的,不需要你手动去修改。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2014年2月20日 6:31
    版主

全部回复

  • 你好:

    1. 清除Cookie其实只要设置Cookie过期就可以了

    cookie.Expires = DateTime.Now.AddDays(-1);

    2. 尝试一下下面方法中传递键值对看看:

    var baseAddress = new Uri("http://example.com");
    var cookieContainer = new CookieContainer();
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
    {
        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("foo", "bar"),
            new KeyValuePair<string, string>("baz", "bazinga"),
        });
    	
        cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
        var result = client.PostAsync("/test", content).Result;
        result.EnsureSuccessStatusCode();
    }
    

    FormUrlEncodedContent对象默认就是UTF-8编码。

    3. 参考以下:

    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Add("Accept", "text/html, application/xhtml+xml, */*");
    client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
    client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.8,sv-SE;q=0.5,sv;q=0.3");
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    
    // Form Data
    

    4. 参考:

    HttpResponseMessage response = client.GetAsync("http://www.baidu.com").Result;
                HttpResponseHeaders headers = response.Headers;


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年2月20日 4:57
    版主
  • 灰常感谢 Caillen Zhong 的详细帮助!

    晚上回家试一下 问题2 的方法,另外 问题4 我也暂时解决了,虽然觉得解决方法的效率不是很理想。针对您的解答,我还有几个关于 cookie 的疑问

    因为我是想使用 HttpClient(或HttpWebRequest)保持对一个网站内的登录和浏览操作,如果我使用这种方式将现有的所有 cookie 设置为过期后,随后使用同一 HttpClient 再次访问此网站,对服务器意味着什么?

    HttpClient 会携带已过期的 cookie 发给服务器吗,还是忽视不发送?

    如果会,服务器看到都是过期的,就会分配给客户端新的 cookie 吗。

    成功访问了网页,有时服务器会在响应头中“Set-Cookie”,这会更改发送请求时携带的 cookie 吗?还用手动的将响应 cookie 添加到 HttpClient 的请求 CookieContainer 中,以便下次正确的携带 cookie 发送请求吗

    谢谢!!!


    不重要的其实最重要

    2014年2月20日 6:07
  • 如果对于浏览器来讲,对于已经过期的Cookie就直接不会发送到服务端。浏览器会对Cookie进行过期检查。

    http://msdn.microsoft.com/en-us/library/aa289495(v=vs.71).aspx

    对于CookieContainer来讲应该也是遵循同样的规则。

    服务器重新将Cookie写回客户端是由服务器端完成的,不需要你手动去修改。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2014年2月20日 6:31
    版主
  • 多谢 Caillen Zhong,我知道怎么弄了

    不重要的其实最重要

    2014年2月20日 6:59