Отправка данных POST с помощью C # - PullRequest
4 голосов
/ 18 января 2011

Это метод, который я пытаюсь использовать, чтобы отправить данные 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 ]

12 голосов
/ 10 июля 2012

Я понимаю, что это старый вопрос, но подумал, что я бы дал ответ с правильным использованием операторов using, чтобы закрытие соединений происходило без необходимости вызова «Close».Также веб-запрос может быть объявлен в рамках метода 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

Надеюсь, это поможет

9 голосов
/ 18 января 2011

В вашем коде логическая ошибка:

webpageStream.Close();

webpageReader = new StreamReader(webpageStream);

Вы закрываете поток, затем пытаетесь читать с него. Когда поток закрыт, он фактически мертв.

Более фундаментальная проблема заключается в том, что вы пытаетесь записать свой запрос в ответ, что не только бессмысленно, но и невозможно! Что вы хотите сделать, это написать в поток request , а затем получить такой ответ:

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

webpageReader = new StreamReader(_webRequest.GetResponse().GetResponseStream());
...