Pregunta

Quiero hacer un túnel a través de una solicitud HTTP desde mi servidor a un servidor remoto, pasando todas las cookies. Entonces creo un nuevo objeto HttpWebRequest y quiero establecer cookies en él.

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

En mi objeto de solicitud entrante:

HttpRequest.Cookies es tipo System.Web.HttpCookieCollection que contiene System.Web.HttpCookies .

Básicamente quiero poder asignarlos entre sí, pero los diferentes tipos lo hacen imposible. ¿Tengo que convertirlos copiando sus valores, o hay una mejor manera?

¿Fue útil?

Solución

Aquí está el código que he usado para transferir los objetos cookie 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 );
}

Otros consejos

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

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

Puede llamarlo desde cualquier objeto HttpRequest con un objeto HttpWebRequest de destino como 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 busco y SourceRequest es la HttpRequest de la página en la que estoy actualmente, recuperada a través de Page.Request.

La sugerencia de David es la correcta. Necesitas copiar. Simplemente cree una función para copiar repetidamente. El objeto HttpCookie y Cookie se crea para asegurarnos de que podemos diferenciar tanto en su funcionalidad como de dónde viene. 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 origina en usted y usted sabe cómo manejarla. Las cookies le permiten administrar las cookies recibidas del servidor web. Al igual que CookieContainer, se puede usar para administrar el dominio, la ruta y la caducidad.

Entonces, el lado del usuario y el lado del servidor web son diferentes y para conectarlo, seguro que necesita convertirlo. En su caso, simplemente se trata de una asignación directa.

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

Vea los detalles y corríjalos aquí:

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

CallMeLaNN

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top