最新消息:VPS服务器又从fzhost.net换回Linode了,主题仍用朋友推荐的大前端D8

【已解决】C#中得到的Http的response中的Set-Cookie的内容的格式不对/错误/不正确 –> 已实现把Set-Cookie部分的字符串解析为CookieCollection

C# crifan 1568浏览 0评论

【问题】

C#中,通过VS2010中的调试过程中发现,访问某个网页,获得对应的http的response中的headers中的Set-Cookie的内容是:

Set-Cookie: MSPRequ=/;Version=1;version&lt=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-XSS-Protection: 0

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&lt=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&lt=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#函数库 crifanLib.cs

转载请注明:在路上 » 【已解决】C#中得到的Http的response中的Set-Cookie的内容的格式不对/错误/不正确 –> 已实现把Set-Cookie部分的字符串解析为CookieCollection

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
15 queries in 0.247 seconds, using 10.33MB memory