使用HttpCookieCollection和CookieContainer发送cookie

我想通过HTTP请求从我的服务器隧道到远程服务器,并通过所有cookie。 所以我创建了一个新的HttpWebRequest对象,并希望在其上设置cookie。

HttpWebRequest.CookieContainerSystem.Net.CookieContainer类型,它包含System.Net.Cookies

在我的传入请求对象上:

HttpRequest.CookiesSystem.Web.HttpCookieCollection类型,它包含System.Web.HttpCookies

基本上我希望能够将它们分配给彼此,但不同的类型使它变得不可能。 我是否必须通过复制它们的值来转换它们,还是有更好的方法?

这是我用于将cookie对象从传入请求传输到新HttpWebRequest的代码…(“myRequest”是我的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 ); } 

我今天需要为使用基于表单的身份validation(FBA)的SharePoint站点执行此操作。 如果您尝试在不克隆cookie并分配CookieContainer对象的情况下调用应用程序页面,则请求将失败。

我选择将这个工作抽象为这个方便的扩展方法:

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

然后,您可以使用目标HttpWebRequest对象作为参数从任何HttpRequest对象调用它,例如:

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

其中TargetUrl是我所追求的页面的Url,SourceRequest是我当前所在页面的HttpRequest,通过Page.Request检索。

大卫的建议是正确的。 你需要复制。 只需创建重复复制的function即可。 创建HttpCookie和Cookie对象是为了确保我们能够区分其function和来源。 在用户和您的代理之间使用的HttpCookie Cookie在您的代理和远程Web服务器之间使用。

HttpCookiefunction较少,因为cookie源自您,您知道如何处理它。 Cookie可让您管理从Web服务器收到的cookie。 与CookieContainer一样,它可用于管理域,路径和到期。

因此,用户端和Web服务器端是不同的并且连接它,确定您需要转换它。 在您的情况下,它只是直接分配。

请注意,CookieContainer在.Add(Cookie)和.GetCookies(uri)方法上存在错误。

查看详细信息并在此处修复:

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

CallMeLaNN