c# .net cookies cookiecontainer

c# - Envío de cookies utilizando HttpCookieCollection y CookieContainer



.net (3)

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

Quiero 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.

HttpWebRequest.CookieContainer es 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 el uno al otro, pero los diferentes tipos lo hacen imposible. ¿Tengo que convertirlos copiando sus valores o hay una forma mejor?


Hoy tuve la necesidad de hacer esto 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á.

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

A continuación, 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 estoy buscando y SourceRequest es la HttpRequest de la página en la que estoy actualmente, recuperada a través de Page.Request.


Lo sugerido por 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.

Así 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.

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

Vea los detalles y arregle aquí:

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

CallMeLaNN