这是我尝试用来将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块中,但根本没有引发任何消息。
有没有人有足够的网络请求经验来帮助我?
非常感谢:)
答案 0 :(得分:12)
我意识到这是一个老问题,但我认为我会提供正确使用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
希望这有帮助
答案 1 :(得分:8)
您的代码中存在逻辑错误:
webpageStream.Close();
webpageReader = new StreamReader(webpageStream);
您正在关闭该流,然后尝试从中读取。一旦流关闭,它实际上已经死了。
更根本的问题是你正在尝试将你的请求写入响应,这不仅是荒谬的,而且也是不可能的!您想要做的是写入请求流,然后得到如下响应:
webpageStream = _webRequest.GetRequestStream();
webpageStream.Write(byteArray, 0, byteArray.Length);
webpageStream.Close();
webpageReader = new StreamReader(_webRequest.GetResponse().GetResponseStream());