发送使用cookie HttpCookieCollection和的CookieContainer(S

2019-06-27 10:26发布

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

HttpWebRequest.CookieContainer是类型System.Net.CookieContainer保持System.Net.Cookies

在我的传入的请求对象:

HttpRequest.Cookies是类型System.Web.HttpCookieCollection保持System.Web.HttpCookies

基本上,我希望能够将它们分配给对方,但不同类型就不可能。 我必须通过复制它们的值将它们转换,或者是有没有更好的办法?

Answer 1:

下面是我用的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 );
}


Answer 2:

我有必要做这个今天使用基于表单的身份验证(FBA)SharePoint网站。 如果你尝试,并调用应用程序页面,而克隆的饼干和分配的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检索。



Answer 3:

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

的HttpCookie具有较少的功能,因为该cookie源于你,你知道如何处理它。 饼干提供您管理从Web服务器接收到的cookie。 类似的CookieContainer,它可以被用来管理域,路径和到期。

因此,用户端和Web服务器端是不同的,连接它,相信你需要将其转换。 根据你的情况,它只是简单地直接分配。

注意的CookieContainer对。新增(饼干)和.GetCookies(URI)的方法中的错误。

查看详细信息并修复在这里:

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

CallMeLaNN



文章来源: Sending cookies using HttpCookieCollection and CookieContainer