2009-06-10 6 views
4

Comment gérer les cookies avec des chemins autres que "/". Un objet HttpWebRequest retourne ces en-têtes:httpwebrequest Cookiecontainer

HTTP/1.1 302 Moved Temporarily 
Transfer-Encoding: chunked 
Date: Wed, 10 Jun 2009 13:22:53 GMT 
Content-Type: text/html; charset=UTF-8 
Expires: Wed, 10 Jun 2009 13:22:53 GMT 
Cache-Control: no-cache, must-revalidate, max-age=0 
Server: nginx/0.7.41 
X-Powered-By: PHP/5.2.9 
Last-Modified: Wed, 10 Jun 2009 13:22:52 GMT 
Pragma: no-cache 
Set-Cookie: cookie1=c1; path=/; domain=site.com 
Set-Cookie: cookie2=c2; path=/content; domain=site.com; httponly 
Set-Cookie: cookie3=c3; path=/admin; domain=site.com; httponly 
Set-Cookie: cookie4=c4; path=/; domain=site.com; httponly 
Location: http://site.com/admin/ 
Via: 1.1 mvo-netcache-02 (NetCache NetApp/6.0.7) 

Itère une collection de biscuits seulement containsthe biscuits avec un chemin de «/». Ainsi, cookiecontainer ne contient que cookie1 et cookie4.

Pourquoi le reste n'est-il pas collecté? Comment accéder aux cookies avec des chemins autres que "/"? Est-ce que je peux rassembler tous les dans un conteneur?

Merci

+0

bryce, ma réponse ne vous aider à résoudre cela? –

Répondre

8

Compte tenu de la fréquence de cette question couvre en ligne, je soupçonne que le problème est que le code de la bibliothèque .NET ne prend pas en charge plusieurs en-têtes Set-Cookie (soit tout le temps ou seulement dans certaines circonstances). Peu importe, c'est assez facile de contourner le problème. Il suffit d'extraire les cookies directement à partir des en-têtes Set-Cookie. Voici un code (copié à l'origine du code joint au this thread) qui montre comment extraire les cookies directement de l'en-tête Set-Cookie.

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; 
    } 
4

Actuellement, CookieContainer a tous les cookies, mais vous ne pouvez pas les voir tous. Lorsque vous l'obtenez à partir de la méthode GelCookies(), il vous donnera des cookies appropriés basés sur le chemin actuel et le domaine. CookieContainer gérera le domaine, le chemin ainsi que l'expiration, mais il a juste un problème de gestion de sous-domaine.

Vérifiez ce pour les détails et le CORRECTIF: http://dot-net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

Questions connexes