【问题标题】:Problem with http 'POST' requesthttp 'POST' 请求的问题
【发布时间】:2011-05-02 01:13:02
【问题描述】:

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

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。

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

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

【问题讨论】:

  • 这个问题似乎与标题完全无关
  • 对不起 - 首先我认为问题在于内容类型已通过,但我忘了更改标题。

标签: c# cookies httpwebrequest


【解决方案1】:

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

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

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

编辑以澄清评论 - 来自MSDN

CookieContainer 默认为空。 您必须分配一个 CookieContainer 反对该物业拥有 cookie 在 Cookies 属性中返回 由返回的 HttpWebResponse GetResponse 方法。

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

【讨论】:

  • 很清楚。我认为空的 CookieContainer 实例是由默认请求构造函数创建的。这是否意味着当我没有明确指定 CookieContainer 时,请求不接受 cookie?这是一种奇怪的行为。因此,当我没有指定 CookieContainer 时,我已经理解了您的帖子,在执行身份验证后,远程网站应用程序无法将 cookie 存储在我的请求数据中,这就是我收到 LoginPage 响应的原因?
  • @danyloid: CookieContainer 默认为null - 你必须创建并分配一个 - 在我的回答中澄清
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多