Как прочитать ответ WebClient после публикации данных? - PullRequest
16 голосов
/ 19 июня 2009

Вот код:

using (var client = new WebClient())
{
    using (var stream = client.OpenWrite("http://localhost/", "POST"))
    {
        stream.Write(post, 0, post.Length);
    }
}

Теперь, как мне прочитать вывод HTTP?

Ответы [ 2 ]

23 голосов
/ 19 июня 2009

Похоже, у вас есть byte[] данных для публикации;в таком случае, я полагаю, вам будет проще использовать:

byte[] response = client.UploadData(address, post);

А если ответ текстовый, что-то вроде:

string s = client.Encoding.GetString(response);

(или ваш выбор Encoding- возможно Encoding.UTF8)

5 голосов
/ 19 января 2017

Если вы хотите хранить потоки повсюду и избегать выделения огромных массивов байтов, что является хорошей практикой (например, если вы планируете публиковать большие файлы), вы все равно можете сделать это с производной версией WebClient. Вот пример кода, который делает это.

using (var client = new WebClientWithResponse())
{
    using (var stream = client.OpenWrite(myUrl))
    {
        // open a huge local file and send it
        using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            file.CopyTo(stream);
        }
    }

    // get response as an array of bytes. You'll need some encoding to convert to string, etc.
    var bytes = client.Response;
}

А вот настроенный WebClient:

public class WebClientWithResponse : WebClient
{
    // we will store the response here. We could store it elsewhere if needed.
    // This presumes the response is not a huge array...
    public byte[] Response { get; private set; }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        var response = base.GetWebResponse(request);
        var httpResponse = response as HttpWebResponse;
        if (httpResponse != null)
        {
            using (var stream = httpResponse.GetResponseStream())
            {
                using (var ms = new MemoryStream())
                {
                    stream.CopyTo(ms);
                    Response = ms.ToArray();
                }
            }
        }
        return response;
    }
}
...