2013-09-25 22 views

cevap

7

Deneyimlerimden, HttpWebRequest.CookieContainer çerezleri yönetmek için bazı sorunlar yaşadım. Bir dereceye kadar çalışabilir, ancak bazen çerezler RFC uyumlu değildir ve CookieContainer'a doğru şekilde ayrıştırılmazlar. Çerezlerinizi manüel olarak istek üzerine Cookie başlığına ekleyerek yönetirseniz, RFC uyumlu olmayan belirli web sitelerinde daha başarılı olursunuz. CookieContainer ile ilgili sorunlardan biri, "26 Eylül 2013" gibi bir tarihte virgülle bir tarih varsa, bunu ayrı bir tanımlama bilgisi olarak tamamen ayrıştırıp ayrıştırmayı kesecektir. Diğer bir sorun ise, HTTP 302 yönlendirmesinde ayarlanan çerezlerin CookieContainer tarafından alınmamasıdır.

Özel gereksinimleriniz için en iyi olana bağlı olmak size kalmış, ancak CookieContainer ile ilgili sorunlar, çerez üstbilgisini el ile ayarlamaya göre farklı sonuçlar sağlıyorsa, çerez üstbilgisini el ile ayarlamak için kullanmanız önerilir. Umarım Microsoft bunu gelecekte de güncelleyecektir, böylece çerezleri yönetmek için güzel .NET sınıflarını kullanmaya geri dönebiliriz.

Düzenleme:
"Set-Cookie" başlığını düzgün bir şekilde ayrıştıran bazı kodlarla karşılaştım. Kurabiyeleri virgülle ayırır ve her çerezin adını, son kullanma tarihini, yolunu, değerini ve etki alanını ayıklar.

Bu kod, Microsoft'un kendi tanımlama bilgisi çözümleyicisinden daha iyi çalışır ve resmi çerez ayrıştırıcısının yapması gereken gerçekten budur. Microsoft'un bunu henüz çözemediğine dair bir fikrim yok çünkü bu çok yaygın bir sorun. http://snipplr.com/view/4427/

ben diye burada göndermeden kulüpler bağlantı noktada iner:

public static CookieCollection GetAllCookiesFromHeader(string strHeader, string strHost) 
{ 
    ArrayList al = new ArrayList(); 
    CookieCollection cc = new CookieCollection(); 
    if (strHeader != string.Empty) 
    { 
     al = ConvertCookieHeaderToArrayList(strHeader); 
     cc = ConvertCookieArraysToCookieCollection(al, strHost); 
    } 
    return cc; 
} 


private static ArrayList ConvertCookieHeaderToArrayList(string strCookHeader) 
{ 
    strCookHeader = strCookHeader.Replace("\r", ""); 
    strCookHeader = strCookHeader.Replace("\n", ""); 
    string[] strCookTemp = strCookHeader.Split(','); 
    ArrayList al = new ArrayList(); 
    int i = 0; 
    int n = strCookTemp.Length; 
    while (i < n) 
    { 
     if (strCookTemp[i].IndexOf("expires=", StringComparison.OrdinalIgnoreCase) > 0) 
     { 
      al.Add(strCookTemp[i] + "," + strCookTemp[i + 1]); 
      i = i + 1; 
     } 
     else 
     { 
      al.Add(strCookTemp[i]); 
     } 
     i = i + 1; 
    } 
    return al; 
} 


private static CookieCollection ConvertCookieArraysToCookieCollection(ArrayList al, string strHost) 
{ 
    CookieCollection cc = new CookieCollection(); 

    int alcount = al.Count; 
    string strEachCook; 
    string[] strEachCookParts; 
    for (int i = 0; i < alcount; i++) 
    { 
     strEachCook = al[i].ToString(); 
     strEachCookParts = strEachCook.Split(';'); 
     int intEachCookPartsCount = strEachCookParts.Length; 
     string strCNameAndCValue = string.Empty; 
     string strPNameAndPValue = string.Empty; 
     string strDNameAndDValue = string.Empty; 
     string[] NameValuePairTemp; 
     Cookie cookTemp = new Cookie(); 

     for (int j = 0; j < intEachCookPartsCount; j++) 
     { 
      if (j == 0) 
      { 
       strCNameAndCValue = strEachCookParts[j]; 
       if (strCNameAndCValue != string.Empty) 
       { 
        int firstEqual = strCNameAndCValue.IndexOf("="); 
        string firstName = strCNameAndCValue.Substring(0, firstEqual); 
        string allValue = strCNameAndCValue.Substring(firstEqual + 1, strCNameAndCValue.Length - (firstEqual + 1)); 
        cookTemp.Name = firstName; 
        cookTemp.Value = allValue; 
       } 
       continue; 
      } 
      if (strEachCookParts[j].IndexOf("path", StringComparison.OrdinalIgnoreCase) >= 0) 
      { 
       strPNameAndPValue = strEachCookParts[j]; 
       if (strPNameAndPValue != string.Empty) 
       { 
        NameValuePairTemp = strPNameAndPValue.Split('='); 
        if (NameValuePairTemp[1] != string.Empty) 
        { 
         cookTemp.Path = NameValuePairTemp[1]; 
        } 
        else 
        { 
         cookTemp.Path = "/"; 
        } 
       } 
       continue; 
      } 

      if (strEachCookParts[j].IndexOf("domain", StringComparison.OrdinalIgnoreCase) >= 0) 
      { 
       strPNameAndPValue = strEachCookParts[j]; 
       if (strPNameAndPValue != string.Empty) 
       { 
        NameValuePairTemp = strPNameAndPValue.Split('='); 

        if (NameValuePairTemp[1] != string.Empty) 
        { 
         cookTemp.Domain = NameValuePairTemp[1]; 
        } 
        else 
        { 
         cookTemp.Domain = strHost; 
        } 
       } 
       continue; 
      } 
     } 

     if (cookTemp.Path == string.Empty) 
     { 
      cookTemp.Path = "/"; 
     } 
     if (cookTemp.Domain == string.Empty) 
     { 
      cookTemp.Domain = strHost; 
     } 
     cc.Add(cookTemp); 
    } 
    return cc; 
} 
İşte

orijinal koddur