在C#中重用与HttpWebRequest的连接

本文关键字:HttpWebRequest 连接 | 更新日期: 2023-09-27 18:21:47

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

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

问题是我得到了一个401未经身份验证的异常,这意味着连接没有被重用。

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.
}

在C#中重用与HttpWebRequest的连接

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

请参阅以下StackOverflow Q&A代表您可能的解决方案:

C#通过httpwebrequest 保持会话id

同一会话中的多个WebRequest

我希望这能有所帮助。

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

票据

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