C# http'的问题;邮政';要求

C# http'的问题;邮政';要求,c#,cookies,httpwebrequest,C#,Cookies,Httpwebrequest,我遇到了一个愚蠢的问题。我有一个方法,它返回初始化的请求,并负责登录某个外部网站 protected HttpWebRequest GetLoginRequest() { const string url = "https://someurl.com/login"; var queryParams = new ArrayList { String.Format("{0

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

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

编辑以澄清评论-来自:

CookieContainer默认为空。 您必须指定CookieContainer 对象设置为要包含Cookie的属性 在的Cookies属性中返回 服务器返回的HttpWebResponse GetResponse方法

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


这个问题似乎与标题完全无关。很抱歉,在第一点上,我认为问题在于内容类型已通过,而我忘记更改标题。很明显。我认为空的CookieContainer实例是由默认的请求构造函数创建的。这是否意味着当我没有明确指定CookieContainer时,请求不接受Cookie?那是一种奇怪的行为。因此,正如我在未指定CookieContainer时所理解的,在执行身份验证后,远程网站应用程序无法在我的请求数据中存储Cookie,这就是我收到LoginPage响应的原因?@danyloid:CookieContainer默认为
null
,您必须创建并分配一个-在我的回答中澄清