Cookies and C# HttpWebRequest

3

我一直在尝试登录到服务器,以获取身份验证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是在请求中设置的,而不是响应中设置的。因此下面的代码有效。我的问题是:为什么?为什么请求被填充,而不是响应?这与post有关吗,而不是get?我完全困惑了。
    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);
        }
    }
1个回答

1
CookieContainer应被视为特定网站的浏览器cookie缓存。你需要在请求中提供容器,然后它会被接收到的cookie填充,并且你可以重复使用该容器进行后续请求。当你发出请求时,容器中的cookie将随请求一起发送(就像浏览器使用存储的cookie一样)。
例如,如果你有一个页面使用cookie来存储认证令牌,你可以在登录请求中传递cookie容器,然后在需要经过身份验证的cookie的后续请求中传递它。
至于为什么不能简单地从请求中提取它,我想微软只是不想在可以在请求中传递可变cookie容器的引用时重复这些事情。

1
其他示例期望响应中包含cookies。那么我想知道里面到底放了什么。谢谢解释,很有道理。 - Simon Parker
@Simon 不用谢。这确实有点不直观,不是吗? - ProgrammingLlama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接