http'POST'请求有问题

时间:2011-05-01 15:39:47

标签: c# cookies httpwebrequest

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

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。

事情是只在第二种情况下执行登录。在第一种情况下,我从登录页面获得响应。我检查了所有案例,结果请求似乎都是正确的。我建议它是目标网站,但我仍然没有看到任何理由。

你能解释一下是什么原因,因为这种行为对我来说似乎很不明显。

1 个答案:

答案 0 :(得分:3)

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

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

简而言之,您在登录后需要为每个请求CookieContainer,并且它需要包含您在登录时收到的表单身份验证Cookie。

编辑以澄清评论 - 来自MSDN

  

默认情况下,CookieContainer为null。   您必须分配CookieContainer   反对该属性有cookie   在Cookies的Cookies属性中返回   由HttpWebResponse返回的   GetResponse方法。

     

出于安全原因,默认情况下会禁用Cookie。如果你想   使用cookies,使用CookieContainer   启用Cookie的属性。