我想通过HTTP请求从我的服务器隧道到远程服务器,并传递所有cookie。所以我创建了一个新的HttpWebRequest
对象,并希望在其上设置cookie。
HttpWebRequest.CookieContainer
是System.Net.CookieContainer
类型,其中包含System.Net.Cookies
。
在我的传入请求对象上:
HttpRequest.Cookies
是System.Web.HttpCookieCollection
类型,其中包含System.Web.HttpCookies
。
基本上我希望能够将它们分配给彼此,但不同的类型使它变得不可能。我是否必须通过复制它们来转换它们,还是有更好的方法?
答案 0 :(得分:36)
这是我用于将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 );
}
答案 1 :(得分:3)
我今天需要为使用基于表单的身份验证(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检索。
答案 2 :(得分:1)
大卫的建议是正确的。你需要复制。只需创建重复复制的功能即可。创建HttpCookie和Cookie对象是为了确保我们能够区分其功能和位置。在用户和您的代理之间使用的HttpCookie Cookie在您的代理和远程Web服务器之间使用。
HttpCookie功能较少,因为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