【问题】
C#中,通过VS2010中的调试过程中发现,访问某个网页,获得对应的http的response中的headers中的Set-Cookie的内容是:
Set-Cookie: MSPRequ=/;Version=1;version<=1329110601&id=250915&co=1; path=/;version=1,MSPVis=$9; Version=1;version=1$250915;domain=login.live.com;path=/,MSPSoftVis=@72198325083833620@:@; domain=login.live.com;path=/;version=1,MSPBack=1329110521; domain=login.live.com;path=/;version=1 |
很明显,Set-Cookie中的前两个cookie,MSPRequ和MSPVis的内容,都是错乱的,格式不正确的,因此无法正确的解析出对应的cookie。
现在想要搞清楚,为何返回的Set-Cookie的内容不正确。
【解决过程】
1.之前就遇到过类似cookie解析的问题,但是在提交对应的http的request之前,换了对应的user-agent为IE8后,就暂时规避了该问题。现在又遇到这个本身所返回的Set-Cookie的值就是不对的。很是无语。
而此处想要尝试不同的User-Agent,会不会对此http的response有影响。
但是,需要说明的是,此处在提交此http请求之前,还需要访问别的网页以实现对应的验证的。而对于该网页验证问题,去尝试了不同的User-Agent,如下:
//IE8 const string gUserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E"; //IE9 //const string gUserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"; //Chrome -> can not get primeResponse //const string gUserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4"; //Mozilla Firefox -> can not get primeResponse //const string gUserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6";
其中只有IE8和IE9的User-Agent,是可以正常工作,通过验证的,其他的User-Agent,如Chrome,Firefox,都是无法通过验证,所以只能尝试,对于把User-Agent换成IE9,看看对于此网页的http请求的response,是否有影响了。
后来测试的结果是,返回的Set-cookie的内容没变化,也是同样的格式错乱。
2.当前所用的C#,调用的是.NET 2.0的,然后去尝试一下,其他可以工作的.NET版本,是否也是返回同样的错误的Set-Cookie。
然后测试了.NET 3.0和3.5,结果都还是没变化,返回的Set-Cookie的内容是错乱的。
【总结】
暂时的感觉是,还是.NET中对于http的response的解析,至少是对Set-Cookie部分的处理和解析,是有bug的。
【后记 2012-02-14、
代码中调试抓出来的responseheader信息为:
+ Headers {Pragma: no-cache X-Content-Type-Options: nosniff Content-Length: 1564 Cache-Control: no-cache Content-Type: text/html; charset=utf-8 Expires: Tue, 14 Feb 2012 05:59:36 GMT P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" Set-Cookie: MSPRequ=/;Version=1;version<=1329199236&id=250915&co=1; path=/;version=1,MSPVis=$9; Version=1;version=1$250915;domain=login.live.com;path=/,MSPSoftVis=@72198325083833620@:@; domain=login.live.com;path=/;version=1,MSPBack=1329199208; domain=login.live.com;path=/;version=1 Server: Microsoft-IIS/7.5 PPServer: PPV: 30 H: BAYIDSLGN1H45 V: 0 Date: Tue, 14 Feb 2012 06:00:36 GMT Connection: close } System.Net.WebHeaderCollection |
可以看到,代码中的得到的set-cookie内容不正常:
MSPRequ=/;Version=1;version<=1329199236&id=250915&co=1; path=/;version=1,MSPVis=$9; Version=1;version=1$250915;domain=login.live.com;path=/,MSPSoftVis=@72198325083833620@:@; domain=login.live.com;path=/;version=1,MSPBack=1329199208; domain=login.live.com;path=/;version=1 |
后来发现了,如果将其中对于的一些内容去掉,变成:
MSPRequ=lt=1329199236&id=250915&co=1; path=/;version=1,MSPVis=$9$250915;domain=login.live.com;path=/,MSPSoftVis=@72198325083833620@:@; domain=login.live.com;path=/;version=1,MSPBack=1329199208; domain=login.live.com;path=/;version=1 |
然后就是正确的set-cookie内容,就可以正确解析了,可以被解析为:
MSPRequ=lt=1329199236&id=250915&co=1; path=/;version=1, MSPVis=$9$250915;domain=login.live.com;path=/, MSPSoftVis=@72198325083833620@:@; domain=login.live.com;path=/;version=1, MSPBack=1329199208; domain=login.live.com;path=/;version=1 |
对于上述4个cookie:
IE9中的是正确解析出来的4个cookie:
Key Value Set-Cookie MSPRequ=lt=1329195425&id=250915&co=1; path=/;version=1 Set-Cookie MSPVis=$9$250915;domain=login.live.com;path=/ Set-Cookie MSPSoftVis=@72198325083833620@:@; domain=login.live.com;path=/;version=1 Set-Cookie MSPBack=1329195424; domain=login.live.com;path=/;version=1 |
Chrome中收到的set-cookie也是对的:
Set-Cookie: MSPRequ=lt=1329198949&id=250915&co=1; path=/;version=1 Set-Cookie: MSPVis=$9$250915;domain=login.live.com;path=/ Set-Cookie: MSPSoftVis=@72198325083833620@:@; domain=login.live.com;path=/;version=1 Set-Cookie: MSPBack=1329198947; domain=login.live.com;path=/;version=1 |
【总结2】
看来,.NET的确有bug,对于同样的网页请求所返回的set-cookie内容,都不正确,导致从库函数所获得的resp.Cookies不正确之外,连自己去解析set-cookie的内容,都会出错。
看来此处,只能自己手动去除掉多余的内容,然后再调用自己写的set-cookie解析函数去解析出来所需要的cookie了。
【后记 2012-03-02】
在发现了.NET解析Set-Cookie有问题后,最后还是通过自己写对应的解析函数,来实现将对应Set-Cookie部分的字符串,解析为对应的CookieCollection的。
详细的代码,不在此重复发布了,可以去这里看到:
转载请注明:在路上 » 【已解决】C#中得到的Http的response中的Set-Cookie的内容的格式不对/错误/不正确 –> 已实现把Set-Cookie部分的字符串解析为CookieCollection