【问题标题】:Reuse Connection with HttpWebRequest in C#在 C# 中重用与 HttpWebRequest 的连接
【发布时间】:2012-01-26 20:46:39
【问题描述】:

我需要使用 .Net 发出 POST 请求。

我可以通过 GET 进行身份验证,因此我尝试在同一连接上发出 POST 请求以保持我的身份验证。

问题是我得到一个 401 Not Authenticated 异常,这意味着连接没有被重用。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("my-server");
request.Credentials = new NetworkCredential("user", "password");

request.GetResponse().Close();  // Works fine

// Now the request I want to make...

request = (HttpWebRequest)WebRequest.Create("my-server");
request.Credentials = new NetworkCredential("user", "password");

request.Method = "post";

string postData = "param1=1&param2=2";
byte[] data = new ASCIIEncoding().GetBytes(postData);
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";

using (Stream stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
    stream.Close();
    request.GetResponse().Close();      // This line gets a 401 Not Authorized error.
}

编辑:有一些建议我需要传输 cookie。以下也不起作用:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("my-server");
request.Credentials = new NetworkCredential("user", "password");

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

var cookieContainer = new CookieContainer();
foreach (Cookie cookie in response.Cookies)
{
    cookieContainer.Add(cookie);
}

response.Close();

// Now the request I want to make...

request = (HttpWebRequest)WebRequest.Create("my-server");
request.Credentials = new NetworkCredential("user", "password");
request.CookieContainer = cookieContainer;

request.Method = "post";

string postData = "param1=1&param2=2";
byte[] data = new ASCIIEncoding().GetBytes(postData);
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";

using (Stream stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
    request.GetResponse().Close();      // This line gets a 401 Not Authorized error.
}

【问题讨论】:

  • Reuse a HttpWebRequest?的可能重复
  • 那里的答案是关闭响应。我已经在第三行完成了。
  • “使用”会自动关闭流,所以可能会删除“stream.Close();”会有所帮助。
  • 新建WebRequest是不是同一个连接?
  • @climbage 我无法在现有内容上设置内容。

标签: c# http httpwebrequest httprequest


【解决方案1】:

你没有保持登录状态的原因是你没有给 HttpWebRequest 一个 CookieContainer 来保存会话 ID。

请参阅 StackOverflow 问答中的以下内容以获得可能的解决方案:

C# keep session id over httpwebrequest

Multiple WebRequest in same session

我希望这会有所帮助。

【讨论】:

  • 另外,HttpWebResponse 不包含任何 cookie。
【解决方案2】:

知道如何在另一端管理身份验证吗? IE。如果它设置了一个 cookie,那么您需要确保您对此进行了说明,请参阅此 page,特别是此注释:

注意

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2020-09-05
    • 2011-06-23
    相关资源
    最近更新 更多