使用C#发送POST数据

这是我尝试用来将POST数据发送到URL并恢复其响应的方法:

public string sendPOST(string URL, string postData) { byte[] byteArray; Stream webpageStream; StreamReader webpageReader; String webpageContent; byteArray = Encoding.UTF8.GetBytes(postData); _webRequest = WebRequest.Create(URL); _webRequest.Method = "POST"; _webRequest.ContentType = "application/x-www-form-urlencoded"; _webRequest.ContentLength = byteArray.Length; webpageStream = _webRequest.GetResponse().GetResponseStream(); webpageStream.Write(byteArray, 0, byteArray.Length); webpageStream.Close(); webpageReader = new StreamReader(webpageStream); webpageContent = webpageReader.ReadToEnd(); return webpageContent; } 

我从MSDN网页上获得了很多这样的代码,所以我知道我大致走在正确的轨道上……但是当我使用以下方法调用该方法时:

 string test = webHelper.sendPOST("http://google.com", "var=1"); MessageBox.Show(test); 

应用程序刚刚锁定。 我已经调试了该方法,据我所知,代码运行良好,直到这一行:

 webpageStream = _webRequest.GetResponse().GetResponseStream(); 

我试过在try块中把它包起来,但根本没有抛出任何exeptions。

有没有人有足够的网络请求经验来帮助我?

非常感谢 :)

我意识到这是一个老问题,但我认为我会提供正确使用using语句的答案,因此无需调用’Close’即可完成连接的关闭。 webrequest也可以在SendPost方法的范围内声明。

 public string SendPost(string url, string postData) { string webpageContent = string.Empty; try { byte[] byteArray = Encoding.UTF8.GetBytes(postData); HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Method = "POST"; webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.ContentLength = byteArray.Length; using (Stream webpageStream = webRequest.GetRequestStream()) { webpageStream.Write(byteArray, 0, byteArray.Length); } using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) { using (StreamReader reader = new StreamReader(webResponse.GetResponseStream())) { webpageContent = reader.ReadToEnd(); } } } catch (Exception ex) { //throw or return an appropriate response/exception } return webpageContent; } 

这也是以下答案https://stackoverflow.com/a/336420/453798

希望这可以帮助

您的代码中存在逻辑错误:

 webpageStream.Close(); webpageReader = new StreamReader(webpageStream); 

您正在关闭流,然后尝试从中读取。 一旦流关闭,它实际上已经死了。

更根本的问题是你试图将你的请求写入响应,这不仅是荒谬的,而且也是不可能的! 你想要做的是写入请求流,然后获得如下响应:

 webpageStream = _webRequest.GetRequestStream(); webpageStream.Write(byteArray, 0, byteArray.Length); webpageStream.Close(); webpageReader = new StreamReader(_webRequest.GetResponse().GetResponseStream());