27

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

HttpWebRequest.CookieContainerSystem.Net.CookieContainer持有的类型System.Net.Cookies

在我传入的请求对象上:

HttpRequest.CookiesSystem.Web.HttpCookieCollection持有的类型System.Web.HttpCookies

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

4

3 回答 3

37

这是我用来将 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 );
}
于 2009-07-31T19:30:15.103 回答
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 检索。

于 2013-05-28T00:46:57.563 回答
2

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

HttpCookie 的功能较少,因为 cookie 来自您并且您知道如何处理它。Cookie 为您提供管理从网络服务器接收的 cookie。和 CookieContainer 一样,它可以用来管理域、路径和过期时间。

所以用户端和Web服务器端是不同的,要连接它,肯定需要转换它。在您的情况下,它只是直接分配。

请注意 CookieContainer 在 .Add(Cookie) 和 .GetCookies(uri) 方法上有一个错误。

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

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

呼叫MeLaNN

于 2009-10-08T14:06:49.980 回答