2009-04-21 9 views
10

Existe-t-il un moyen d'obtenir l'objet HttpWebRequest pour prendre en compte l'en-tête set-cookie lorsqu'il est automatiquement redirigé vers une autre page via la fonctionnalité AllowAutoRedirect? J'en ai besoin pour maintenir les informations de cookie à travers les redirections; Je préférerais ne pas avoir à mettre en œuvre la redirection moi-même si le cadre peut le faire pour moi. Cela doit être une requête courante puisque la plupart des pages de connexion que j'ai vues le font habituellement.Comment obtenir HttpWebRequest.AllowAutoRedirect pour définir les cookies lors d'un GET/POST sur la page redrected?

Répondre

5

Je sais que des requêtes distinctes (par exemple, des objets HttpRequest différents) fonctionnent avec des cookies, vous devez définir la propriété HttpRequest.CookieContainer sur les deux requêtes sur la même instance d'un CookieContainer. Vous pourriez avoir besoin de cela pour cette affaire aussi.

+0

Pour une raison quelconque, cela n'a pas fonctionné pour moi. Lorsque domainA.com a émis SetCookie cookie = val pour ".subdomain.domainB.com", apparemment la période au début de la valeur du domaine cookie a confondu la classe CookieContainer intégrée de .NET, et lorsque des demandes ont été faites pour subdomain.domainB.com , le cookie n'a jamais été envoyé avec ces demandes, même si CookieContainer a été correctement affecté à la demande. –

+1

Donc ma solution était dans mon cas simple (interaction efficace avec juste 1 site Web) est de: 1) dissalow auto-redirections, donc je peux voir tous les en-têtes Set-cookie et peut les analyser; 2) Enregistrer toutes les paires nom-valeur de cookie dans un dictionnaire (vérifier l'unicité et mettre à jour les valeurs si nécessaire); et enfin: 3) à chaque requête subséquente, truquer les données dictionnaires dans un en-tête Cookies personnalisé ajouté manuellement à la requête (notez que CookiContrainer de la requête doit être nul pour que cela fonctionne); alors tous les biscuits ont traversé et cela a fonctionné. –

0

Si vous ne souhaitez pas utiliser un CookieContainer, le code suivant accédera à une page, en fournissant le cookie dans le paramètre. Ensuite, il va télécharger tous les cookies définis par cette page et les retourner comme une liste de chaînes.

Notez que AllowAutoRedirect est défini sur false. Si vous souhaitez suivre la redirection, extrayez cet objet des en-têtes HttpWebResponse, puis construisez manuellement une autre requête Web.

Public Shared Function GetCookiesSetByPage(ByVal strUrl As String, ByVal cookieToProvide As String) As IEnumerable(Of String) 

    Dim req As System.Net.HttpWebRequest 
    Dim res As System.Net.HttpWebResponse 
    Dim sr As System.IO.StreamReader 

    '--notice that the instance is created using webrequest 
    '--this is what microsoft recomends 
    req = System.Net.WebRequest.Create(strUrl) 

    'set the standard header information 
    req.Accept = "*/*" 
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)" 
    req.ContentType = "application/x-www-form-urlencoded" 
    req.AllowAutoRedirect = False 
    req.Headers.Add(HttpRequestHeader.Cookie, cookieToProvide) 
    res = req.GetResponse() 

    'read in the page 
    sr = New System.IO.StreamReader(res.GetResponseStream()) 
    Dim strResponse As String = sr.ReadToEnd 

    'Get the cooking from teh response 
    Dim strCookie As String = res.Headers(System.Net.HttpResponseHeader.SetCookie) 
    Dim strRedirectLocation As String = res.Headers(System.Net.HttpResponseHeader.Location) 
    Dim result As New List(Of String) 
    If Not strCookie = Nothing Then 
     result.Add(strCookie) 
    End If 
    result.Add(strRedirectLocation) 
    Return result 
End Function