C# 网络响应cookies

C# 网络响应cookies,c#,asp.net-mvc,C#,Asp.net Mvc,使用WebRequest和WebResponse,我能够将登录信息发布到外部站点,并在Response.Cookies和我的CookieContainer中接收cookie。我知道这是可行的,因为在相同的过程中,我可以请求不同的页面,而不会被重定向到登录页面。这个cookie允许我在不使用每个页面视图登录的情况下留在站点上 我现在正试图使用Response.Cookies.add(httpCookie)将cookie添加到客户端浏览器中 然而,它只是持续到过程结束。重新加载页面,cookie将不

使用
WebRequest
WebResponse
,我能够将登录信息发布到外部站点,并在
Response.Cookies
和我的
CookieContainer
中接收cookie。我知道这是可行的,因为在相同的过程中,我可以请求不同的页面,而不会被重定向到登录页面。这个cookie允许我在不使用每个页面视图登录的情况下留在站点上

我现在正试图使用
Response.Cookies.add(httpCookie)
将cookie添加到客户端浏览器中

然而,它只是持续到过程结束。重新加载页面,cookie将不再可用


我做错了什么

您从外部站点的
WebResponse
收到的cookie不能传递到您自己的客户端浏览器上。这是因为cookie模型固有的安全限制:浏览器不支持一个域为另一个域设置cookie

这可能会一直工作到当前请求结束,因为您正在读取刚刚添加cookie的
HttpCookieCollection
。此集合将持续存在,直到当前HTTP请求结束

但是,老实说,我不知道你是如何做到这一点的,因为
System.Net.HttpWebResponse
CookieContainer
使用
System.Net.Cookie
,而
Response.Cookies
集合使用
System.Web.HttpCookie

无论如何,您最好将
WebResponse
中获得的cookie值存储到您自己发送到浏览器的cookie中。然后,在以后的请求中,读取您自己的cookie,为外部站点构建一个新的
cookie
,并手动将其添加到
CookieContainer

下面是一些伪代码,假设外部站点正在查找的cookie名为“sessionKey”,我们使用“myCookie”作为发送到客户端浏览器的cookie名称:

public ActionResult MyAction()
{
    var container = new CookieContainer();

    if (Request.Cookies["myCookie"] != null)
    {
         // browser has passed in "myCookie".
         // use this to create the "sessionKey" cookie to send.
         var cookie = new System.Net.Cookie("sessionKey",
             Request.Cookies["myCookie"].Value, "/", "external-site.com");

         container.Add(cookie);
    }

    HttpWebRequest request;
    HttpWebResponse response;

    // initialize the request.
    // ...

    // make sure we're using our cookie container.
    request.CookieContainer = container;

    // execute the request and get the response.
    response = request.GetResponse();

    // send a cookie, "myCookie", to the browser.
    // it will contain the value of the "sessionKey" cookie.
    Response.Cookies["myCookie"].Value = response.Cookies["sessionKey"].Value;
}

看看这个答案,也许会有帮助,谢谢你的回答。你给我通风报信说为什么我没有看到饼干。我想知道为什么没有在Sharepoint中设置cookie,然后我读了这篇文章,发现我在不同的区域。