2009-07-31 9 views
24

Desidero sottoporre a tunnel una richiesta HTTP dal mio server a un server remoto, passando attraverso tutti i cookie. Quindi creo un nuovo oggetto HttpWebRequest e voglio impostarlo su di esso.Invio di cookie tramite HttpCookieCollection e CookieContainer

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

Sul mio oggetto richiesta in arrivo:

HttpRequest.Cookies è scrivere System.Web.HttpCookieCollection che detiene System.Web.HttpCookies.

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

risposta

34

Ecco il codice che ho usato per trasferire gli oggetti di cookie dalla richiesta in arrivo per il nuovo HttpWebRequest ... ("myRequest" è il nome della mia HttpWebRequest oggetto.)

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); 
} 
+0

Penso che questa tecnica funzionerà, ma speravo davvero in una soluzione che non implicasse la copia di ciascun valore. – Mike

+0

che cosa è con la prova con il fermo vuoto? – CRice

+0

buon punto, che è stato rimosso. – David

1

Il suggerito da David è quello giusto. Devi copiare. Basta semplicemente creare la funzione per copiare più volte. L'oggetto HttpCookie e Cookie è stato creato per essere certi di poter differenziare sia nella sua funzionalità che nella sua provenienza. HttpCookie utilizzato tra utente e proxy Il cookie viene utilizzato tra il proxy e il server Web remoto.

HttpCookie ha meno funzionalità in quanto il cookie è originato da te e sai come gestirlo. I cookie ti consentono di gestire i 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 collegarlo, è necessario convertirlo. Nel tuo caso, si tratta semplicemente di un compito diretto.

Si noti che CookieContainer ha un bug sui metodi .Add (Cookie) e .GetCookies (uri).

Vedi i dettagli e fissare qui:

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

CallMeLaNN

3

ho avuto la necessità di fare questo oggi per un sito di SharePoint che utilizza autenticazione basata su form (FBA). Se si tenta di chiamare una pagina dell'applicazione senza clonare i cookie e assegnare un oggetto CookieContainer, la richiesta avrà esito negativo.

ho scelto di astrarre il lavoro a questo metodo di estensione a portata di mano:

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 chiamare da qualsiasi oggetto HttpRequest con un target HttpWebRequest oggetto come un 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 I am after e SourceRequest è la HttpRequest della pagina I am on attualmente, recuperata tramite Page.Request.

Problemi correlati