终于找到问题了,原来是.net framework2.0,3.0,3.5的CookieContainer的bug解决方法

找了 很久都发现不出问题,最后终于发现原来是微软的一个BUG

 

用HttpWebRequest发送请求,附上了CookieContainer(CookieContainer里面确定已经包含了所有需要的 Cookie),但是当发送请求后某些Cookie并没有发送出去,调试了两天,一直觉得是请求的网站设了什么古怪的限制,使请求老是发送不成功,最后用 SocketSniff抓包发现少发送了几个Cookie(因为这些cookie涉及到几个子域名),检查CookieContainer,里面确实有这 几个Cookie,最后只好反编译HttpWebRequest,在类CookieModule里发现方法OnSendingHeaders的如下代码, 这个是把cookie设置到headers里面的关键地方:

internal static void OnSendingHeaders(HttpWebRequest httpWebRequest)
{
try
{
if (httpWebRequest.CookieContainer != null)
{
string str;
httpWebRequest.Headers.RemoveInternal("Cookie");
string cookieHeader = httpWebRequest.CookieContainer. GetCookieHeader(httpWebRequest.Address, out str);
if (cookieHeader.Length > 0)
{
httpWebRequest.Headers["Cookie"] = cookieHeader;
}
}
}
catch
{
}
}
问题出在GetCookieHeader这个方法里面,某些Cookie的domain判断错误导致没有附加上去。.Net framework4.0以下的都存在此问题。最后把程序框架调到4.0的,就没有这个问题了。当然4.0以下的框架版本可以用下面的方法处理一下 CookieContainer里面domain。
  1. Don't use .Add(Cookie), Use only .Add(Uri, Cookie) method.
  2. Call BugFix_CookieDomain each time you add a cookie to the container or before you use .GetCookie or before system use the container.



private   void  BugFix_CookieDomain(CookieContainer cookieContainer)
{
    System.Type _ContainerType 
=   typeof (CookieContainer);
    Hashtable table 
=  (Hashtable)_ContainerType.InvokeMember( " m_domainTable " ,
                               System.Reflection.BindingFlags.NonPublic 
|
                               System.Reflection.BindingFlags.GetField 
|
                               System.Reflection.BindingFlags.Instance,
                               
null ,
                               cookieContainer,
                               
new   object [] { });
    ArrayList keys 
=   new  ArrayList(table.Keys);
    
foreach  ( string  keyObj  in  keys)
    {
        
string  key  =  (keyObj  as   string );
        
if  (key[ 0 ==   ' . ' )
        {
            
string  newKey  =  key.Remove( 0 1 );
            table[newKey] 
=  table[keyObj];
        }
    }
}

转载于:https://www.cnblogs.com/goody9807/archive/2011/07/19/2110535.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值