繁体   English   中英

Cookies和C#HttpWebRequest

[英]Cookies and C# HttpWebRequest

我一直在尝试登录到服务器以获取身份验证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已在请求中设置,而不是响应。 所以下面的代码工作。 我的问题是:为什么? 为什么要填充请求,而不是响应? 是作为一个帖子,而不是一个得到的东西? 我完全不知所措。

    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);
        }
    }

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM