使用C#发送POST数据

时间:2011-01-17 22:04:30

标签: c# post httpwebrequest webrequest

这是我尝试用来将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块中,但根本没有引发任何消息。

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

非常感谢:)

2 个答案:

答案 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());