【问题标题】:Cookies and C# HttpWebRequestCookie 和 C# HttpWebRequest
【发布时间】:2018-06-15 09:42:30
【问题描述】:

我一直在尝试登录服务器以获取身份验证 cookie(会话 cookie),然后我可以将其用于进一步调用服务器。我读过的每个例子都遵循相同的模式:

HttpWebRequest request = WebRequest.Create(loginURL) as HttpWebRequest;
var response = request.GetResponse() as HttpWebResponse;

var cookies = response.Cookies;

这对我不起作用,因为 cookies 变量最终为空,并且调试分析显示 response.Cookies 为空。服务器是我的,我可以通过调试看到正在设置cookie。如果我用它登录到我的网站,我也可以在 Firefox 中看到 cookie。所以我知道cookie正在被设置。

经过一番折腾,我发现 cookie 是在 request 中设置的,而不是在响应中。所以下面的代码有效。我的问题是:为什么?为什么请求被填充,而不是响应?这与成为帖子有关,而不是与获取有关吗?我完全感到困惑。

    private void Login()
    {
        string userName = UserNameText.Text;
        string password = PasswordText.Password;
        string baseURL = URLText.Text;

        string loginURL = baseURL + "/Authentication/LoginAction";

        HttpWebRequest request = WebRequest.Create(loginURL) as HttpWebRequest;
        request.Method = "POST";

        string formContent =
            "UserName=" + userName +
            "&Password=" + password;

        var byteArray = Encoding.UTF8.GetBytes(formContent);
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = byteArray.Length;
        request.CookieContainer = new CookieContainer();

        try
        {
            using (var dataStream = request.GetRequestStream())
            {

                dataStream.Write(byteArray, 0, byteArray.Length);

                using (var response = request.GetResponse() as HttpWebResponse)
                {
                    var cookies = request.CookieContainer;

                    if (cookies.Count != 0)
                    {
                        cookies_ = cookies;
                    }
                }
            }
        }
        catch(Exception ex)
        {
            // don't bother too much
            Debug.WriteLine(ex.Message);
        }
    }

【问题讨论】:

    标签: c# http web cookies


    【解决方案1】:

    CookieContainer 应被视为类似于特定站点的浏览器 cookie 缓存。这个想法是您将容器作为请求的一部分提供,然后由您收到的 cookie 填充它,您可以将该容器重用于后续请求。当您发出请求时,容器中的 cookie 会随请求一起发送(就像浏览器使用存储的 cookie 一样)。

    因此,例如,如果您有一个使用 cookie 存储身份验证令牌的页面,您可以将 cookie 容器与登录请求一起传递,然后将其与需要经过身份验证的 cookie 的后续请求一起传递。

    至于为什么你不能简单地从请求中提取它,我猜微软只是不想在你可以在请求中传递对可变 cookie 容器的引用时复制东西。

    【讨论】:

    • 其他示例期望响应中包含 cookie。我想知道那里会发生什么。感谢您的解释。这是有道理的。
    • @Simon 不客气。这当然很不直观,不是吗?
    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2010-10-08
    • 2012-08-10
    相关资源
    最近更新 更多