在C#中重用与HttpWebRequest的连接

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

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

问题是我得到401 Not Authenticatedexception,这意味着连接没有被重用。

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

您没有保持登录状态的原因是您没有为HttpWebRequest提供CookieContainer来保持会话ID。

有关可能的解决方案,请参阅以下StackOverflow问答:

C#通过httpwebrequest保持会话ID

同一会话中的多个WebRequest

我希望这有帮助。

知道如何在另一端管理身份validation吗? IE浏览器。 如果它设置了一个cookie,那么你需要确保你考虑到这一点,请参阅此页面 ,特别是这个说明:

注意

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