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

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来请求:

var cookieContainer = new CookieContainer();

var request = GetLoginRequest();
request.CookieContainer = cookieContainer;

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


因为我需要存储CookieContainer。

问题是登录仅在第二种情况下执行。在第一种情况下,我从登录页面得到响应。我检查了所有情况,两个结果请求似乎相同。我建议它是目标站点专用的,但是我仍然看不到任何原因。

您能否解释一下原因是什么,因为这种行为对我而言似乎并不明显。

最佳答案

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

大多数登录机制都使用cookie来存储与已建立登录相关的状态。即对于表单身份验证,cookie是表单身份验证票证的容器。票证作为每个请求的表单身份验证cookie的值传递,并由服务器上的表单身份验证使用以标识已身份验证的用户。

简而言之,您登录后的每个请求都需要一个CookieContainer,并且其中必须包含您登录时收到的表单身份验证cookie。

编辑以澄清评论-来自MSDN


  CookieContainer默认为null。
  您必须分配一个CookieContainer
  反对该属性以具有cookie
  在的Cookies属性中返回
  由返回的HttpWebResponse
  GetResponse方法。
  
  出于安全原因,默认情况下禁用cookie。如果你想
  使用Cookie,使用CookieContainer
  属性以启用Cookie。

09-25 17:10