使用C#发送POST数据

Wen*_*Wen 4 c# post webrequest httpwebrequest

这是我试图用来将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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

webpageStream = _webRequest.GetResponse().GetResponseStream();
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢 :)

Gee*_*eek 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;
}
Run Code Online (Sandbox Code Playgroud)

这也是以下答案/sf/answers/23549431/

希望这可以帮助


Ada*_*son 9

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

webpageStream.Close();

webpageReader = new StreamReader(webpageStream);
Run Code Online (Sandbox Code Playgroud)

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

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

webpageStream = _webRequest.GetRequestStream();
webpageStream.Write(byteArray, 0, byteArray.Length);
webpageStream.Close();

webpageReader = new StreamReader(_webRequest.GetResponse().GetResponseStream());
Run Code Online (Sandbox Code Playgroud)