2012-03-27 47 views
0

我使用HttpWebRequest從網站下載數據,並且我注意到了一個與cookies相關的錯誤。 當您從domain.com獲取數據時,該網站將重定向到發送cookie的www.domain.com,該cookie不會與domain.com共享。這會在我的應用程序中導致一些令人討厭的錯誤。如何在domain.com和www.domain.com之間共享cookie?

我知道www.domain.com並不需要與domain.com相同的網站,但我相信在這種情況下,好處將超過任何相關風險。

有沒有簡單的方法可以將cookies從domain.com自動應用到www.domain.com,反之亦然?

+0

是domain.com域?如果是的話,那麼你可以修改cookie來處理子域。 – f2lollpll 2012-03-27 09:22:09

+0

不,這不是我的域名 – 2012-03-27 09:23:03

回答

0

這裏就是我所做的:

class DomainComparer : StringComparer 
    { 
     public override int Compare(string x, string y) 
     { 
      if (x == null || y == null) 
      { 
       return StringComparer.OrdinalIgnoreCase.Compare(x, y); 
      } 
      if (x.StartsWith("www.", StringComparison.OrdinalIgnoreCase)) 
      { 
       x = x.Substring(4); 
      } 
      if (y.StartsWith("www.", StringComparison.OrdinalIgnoreCase)) 
      { 
       y = y.Substring(4); 
      } 
      return StringComparer.OrdinalIgnoreCase.Compare(x, y); 
     } 

     public override bool Equals(string x, string y) 
     { 
      return Compare(x, y) == 0; 
     } 

     public override int GetHashCode(string obj) 
     { 
      if (obj.StartsWith("www.", StringComparison.OrdinalIgnoreCase)) 
      { 
       obj = obj.Substring(4); 
      } 
      return StringComparer.OrdinalIgnoreCase.GetHashCode(obj); 
     } 
    } 

    /// <summary> 
    /// this is a hackfix for microsoft bug, where cookies are not shared between www.domain.com and domain.com 
    /// </summary> 
    /// <param name="cc"></param> 
    static void ImproveCookieContainer(CookieContainer cc) 
    { 
     Hashtable table = (Hashtable)cc.GetType().InvokeMember(
      "m_domainTable", 
      System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, 
      null, cc, new object[] { }); 
     var comparerPreperty = table.GetType().GetField("_keycomparer", 
      System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance); 
     if (comparerPreperty != null) 
     { 
      comparerPreperty.SetValue(table, new DomainComparer()); 
     } 
    } 
0

將您的cookie內容存儲在會話對象中,並使用標識會話對象的會話密鑰調用新頁面。然後在爲www.domain.com提供頁面時查找會話並設置新的cookie。

相關問題