[英]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.