2009-07-31 11 views
24

Deseo hacer un túnel a través de una solicitud HTTP desde mi servidor a un servidor remoto, pasando por todas las cookies. Entonces creo un nuevo objeto HttpWebRequest y quiero establecer cookies en él.Envío de cookies usando HttpCookieCollection y CookieContainer

HttpWebRequest.CookieContainer es el tipo System.Net.CookieContainer que contiene System.Net.Cookies.

En mi solicitud entrante objeto:

HttpRequest.Cookies es escribir System.Web.HttpCookieCollection que mantiene System.Web.HttpCookies.

Básicamente quiero poder asignarlos el uno al otro, pero los diferentes tipos lo hacen imposible. ¿Tengo que convertirlos copiando sus valores o hay una forma mejor?

Respuesta

34

Aquí está el código que he usado para transferir los objetos de la galleta de la solicitud entrante a la nueva HttpWebRequest ... ("myRequest" es el nombre de mi objeto 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); 
} 
+0

Creo que esta técnica funcionará, pero realmente estaba esperando una solución que no implique copiar cada valor. – Mike

+0

¿Qué pasa con el intento con la captura vacía? – CRice

+0

buen punto, eso ha sido eliminado. – David

1

El sugirió a partir David es el correcto. Tienes que copiar. Simplemente crea una función para copiar repetidamente. El objeto HttpCookie and Cookie se crea para garantizar que podamos diferenciar tanto en su funcionalidad como en su lugar. HttpCookie utilizado entre el usuario y su proxy La cookie se usa entre su proxy y el servidor web remoto.

HttpCookie tiene menos funcionalidad ya que la cookie se originó de usted y usted sabe cómo manejarla. Cookie le proporciona administrar la cookie recibida del servidor web. Al igual que CookieContainer, se puede usar para administrar dominio, ruta y caducidad.

Por lo que el lado del usuario y el lado del servidor web es diferente y para conectarlo, seguro que necesita convertirlo. En tu caso, simplemente dirige la tarea.

Observe que CookieContainer tiene un error en los métodos .Add (Cookie) y .GetCookies (uri).

ver los detalles y fijar aquí:

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

CallMeLaNN

3

tuve la necesidad de hacer esto hoy en día para un sitio de SharePoint que utiliza la autenticación basada en formularios (FBA). Si intentas llamar a una página de aplicación sin clonar las cookies y asignar un objeto CookieContainer, la solicitud fallará.

me eligieron para abstraer el trabajo a este práctico método de extensión:

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

continuación, puede simplemente llamar desde cualquier objeto HttpRequest con un objetivo HttpWebRequest objeto como un parámetro, por ejemplo:

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

donde TargetUrl es la URL de la página que estoy buscando y SourceRequest es la HttpRequest de la página en la que estoy actualmente, recuperada a través de Page.Request.

Cuestiones relacionadas