Domanda

Voglio passare attraverso una richiesta HTTP dal mio server a un server remoto, passando attraverso tutti i cookie. Quindi creo un nuovo oggetto HttpWebRequest e voglio impostare i cookie su di esso.

HttpWebRequest.CookieContainer è di tipo System.Net.CookieContainer che contiene System.Net.Cookies .

Sull'oggetto della mia richiesta in arrivo:

HttpRequest.Cookies è di tipo System.Web.HttpCookieCollection che contiene System.Web.HttpCookies .

Fondamentalmente voglio essere in grado di assegnarli l'uno all'altro, ma i diversi tipi lo rendono impossibile. Devo convertirli copiando i loro valori o c'è un modo migliore?

È stato utile?

Soluzione

Ecco il codice che ho usato per trasferire gli oggetti cookie dalla richiesta in arrivo al nuovo HttpWebRequest ... (" myRequest " è il nome del mio oggetto 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 );
}

Altri suggerimenti

Oggi avevo bisogno di farlo per un sito di SharePoint che utilizza l'autenticazione basata su moduli (FBA). Se provi a chiamare una pagina dell'applicazione senza clonare i cookie e assegnare un oggetto CookieContainer, la richiesta fallirà.

Ho scelto di astrarre il lavoro con questo pratico metodo di estensione:

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

È quindi possibile chiamarlo da qualsiasi oggetto HttpRequest con un oggetto HttpWebRequest di destinazione come parametro, ad esempio:

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

dove TargetUrl è l'URL della pagina che sto cercando e SourceRequest è l'HttpRequest della pagina in cui mi trovo attualmente, recuperato tramite Page.Request.

Il suggerito da David è quello giusto. Devi copiare. Basta semplicemente creare una funzione da copiare ripetutamente. L'oggetto HttpCookie e Cookie è stato creato per essere sicuri che possiamo differenziare sia nella sua funzionalità che nella sua provenienza. HttpCookie utilizzato tra l'utente e il proxy Il cookie viene utilizzato tra il proxy e il server Web remoto.

HttpCookie ha meno funzionalità poiché il cookie è stato originato da te e sai come gestirlo. I cookie forniscono la gestione dei cookie ricevuti dal server Web. Come CookieContainer, può essere utilizzato per gestire dominio, percorso e scadenza.

Quindi lato utente e lato server Web sono diversi e per connetterlo, è necessario convertirlo. Nel tuo caso, semplicemente dirige il compito.

Si noti che CookieContainer ha un bug sul metodo .Add (Cookie) e .GetCookies (uri).

Vedi i dettagli e correggi qui:

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

CallMeLaNN

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top