Problem with http 'POST' request

本文关键字:request POST with http Problem | 更新日期: 2023-09-27 17:54:19

我遇到了一个愚蠢的问题。我有一个方法,返回负责在一些外部网站登录的初始化请求。

protected HttpWebRequest GetLoginRequest()
{
    const string url = "https://someurl.com/login";
    var queryParams = new ArrayList
                          {
                              String.Format("{0}={1}", "email", Email),
                              String.Format("{0}={1}", "password", DecryptedPassword)
                          };
    var parameters = String.Join("&", (String[])queryParams.ToArray(typeof(String)));
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = parameters.Length;
    request.Timeout = 10000;
    var streamWriter = new StreamWriter(request.GetRequestStream());
    streamWriter.Write(parameters);
    streamWriter.Close();
    return request;
}

我在代码中的两个地方调用这个方法。第一个调用看起来像这样:

var request = GetLoginRequest();
var response = (HttpWebResponse)request.GetResponse();

第二个将CookieContainer分配给request:

var cookieContainer = new CookieContainer();
var request = GetLoginRequest();
request.CookieContainer = cookieContainer;
var response = (HttpWebResponse)request.GetResponse();

因为我需要存储CookieContainer

问题是,只有在第二种情况下才执行登录。在第一种情况下,我从登录页面得到响应。我检查了所有的案例,两个请求看起来是一样的。我建议这是针对目标网站的,但我仍然没有看到任何理由。

你能解释一下是什么原因吗,因为这个行为在我看来很不明显

Problem with http 'POST' request

当您在请求上设置CookieContainer属性时,响应将使用从执行请求接收到的cookie填充CookieContainer实例。

大多数登录机制使用cookie来存储与已建立的登录相关的状态。例如,在表单身份验证的情况下,cookie是表单身份验证票据的容器。该票据作为表单身份验证cookie的值随每个请求一起传递,并由服务器上的表单身份验证使用,以标识经过身份验证的用户。

简而言之,你需要一个CookieContainer为每个请求后,你登录,它需要包含表单认证cookie,你收到当你登录。

编辑澄清评论-来自MSDN:

CookieContainer默认为空。你必须分配一个cookicontainer对象到具有cookie的属性的Cookies属性中返回方法返回的HttpWebResponseGetResponse方法。

出于安全考虑,默认禁用cookie。如果你想使用cookie,使用cookicontainer