Question

Je souhaite créer un tunnel via une requête HTTP de mon serveur à un serveur distant en passant par tous les cookies. Je crée donc un nouvel objet HttpWebRequest et souhaite y placer des cookies.

HttpWebRequest.CookieContainer est du type System.Net.CookieContainer qui contient System.Net.Cookies . .

Sur mon objet de requête entrant:

HttpRequest.Cookies est du type System.Web.HttpCookieCollection qui contient System.Web.HttpCookies . .

En gros, je veux pouvoir les assigner les uns aux autres, mais les types différents le rendent impossible. Dois-je les convertir en copiant leurs valeurs ou existe-t-il un meilleur moyen?

Était-ce utile?

La solution

Voici le code que j'ai utilisé pour transférer les objets de cookie de la demande entrante vers le nouveau HttpWebRequest ... ("myRequest" est le nom de mon objet HttpWebRequest.)

HttpCookieCollection oCookies = Request.Cookies;
for ( int j = 0; j < oCookies.Count; j++ ) 
{
    HttpCookie oCookie = oCookies.Get( j );
    Cookie oC = new Cookie();

    // Convert between the System.Net.Cookie to a System.Web.HttpCookie...
    oC.Domain   = myRequest.RequestUri.Host;
    oC.Expires  = oCookie.Expires;
    oC.Name     = oCookie.Name;
    oC.Path     = oCookie.Path;
    oC.Secure   = oCookie.Secure;
    oC.Value    = oCookie.Value;

    myRequest.CookieContainer.Add( oC );
}

Autres conseils

J'avais besoin de le faire aujourd'hui pour un site SharePoint utilisant l'authentification par formulaire (FBA). Si vous essayez d'appeler une page d'application sans cloner les cookies ni affecter un objet CookieContainer, la requête échouera.

J'ai choisi de résumer le travail à cette méthode d'extension pratique:

public static CookieContainer GetCookieContainer(this System.Web.HttpRequest SourceHttpRequest, System.Net.HttpWebRequest TargetHttpWebRequest)
    {
        System.Web.HttpCookieCollection sourceCookies = SourceHttpRequest.Cookies;
        if (sourceCookies.Count == 0)
            return null;
        else
        {
            CookieContainer cookieContainer = new CookieContainer();
            for (int i = 0; i < sourceCookies.Count; i++)                
            {
                System.Web.HttpCookie cSource = sourceCookies[i];
                Cookie cookieTarget = new Cookie() { Domain = TargetHttpWebRequest.RequestUri.Host, 
                                                     Name = cSource.Name, 
                                                     Path = cSource.Path, 
                                                     Secure = cSource.Secure, 
                                                     Value = cSource.Value };
                cookieContainer.Add(cookieTarget);
            }
            return cookieContainer;
        }
    }

Vous pouvez alors simplement l'appeler à partir de n'importe quel objet HttpRequest avec un objet cible HttpWebRequest en tant que paramètre, par exemple:

HttpWebRequest request;                
request = (HttpWebRequest)WebRequest.Create(TargetUrl);
request.Method = "GET";
request.Credentials = CredentialCache.DefaultCredentials;
request.CookieContainer = SourceRequest.GetCookieContainer(request);                
request.BeginGetResponse(null, null);

où TargetUrl est l'URL de la page que je suis après et SourceRequest est la requête HttpRequest de la page sur laquelle je suis actuellement, récupérée via Page.Request.

La suggestion de David est la bonne. Vous devez copier. Il suffit simplement de créer une fonction pour copier à plusieurs reprises. L'objet HttpCookie and Cookie est créé pour nous assurer que nous pouvons différencier à la fois sa fonctionnalité et son origine. HttpCookie utilisé entre l'utilisateur et votre proxy Le cookie est utilisé entre votre proxy et le serveur Web distant.

HttpCookie a moins de fonctionnalités car le cookie provient de vous et vous savez comment le gérer. Les cookies vous permettent de gérer les cookies provenant du serveur Web. Comme CookieContainer, il peut être utilisé pour gérer le domaine, le chemin d'accès et l'expiration.

Le côté utilisateur et le côté serveur Web sont donc différents et pour le connecter, assurez-vous de le convertir. Dans votre cas, il s’agit simplement d’une cession directe.

Notez que CookieContainer a un bogue sur les méthodes .Add (Cookie) et .GetCookies (uri).

Voir les détails et résoudre le problème ici:

http: // point -net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html

CallMeLaNN

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top