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
,您必须创建并分配一个-在我的回答中澄清