2009-06-18 70 views
14

看哪代码:如何在发布数据后读取WebClient响应?

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

现在,我该如何读取HTTP输出?

+0

另见http://stackoverflow.com/questions/1694388/webclient-vs-httpwebrequest-httpwebresponse。 – DuckMaestro 2015-01-14 19:49:30

回答

19

它看起来像你有一个byte[]的数据发布;在这种情况下,我想你会发现它更容易使用:

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

如果响应是文本,一样的东西:

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

(或您的Encoding选择 - 也许Encoding.UTF8

+0

如果我没有尝试读取HTTP 500响应,这将变成异常,它会起作用。但是你的回答肯定会满足问题的要求。 – 2009-06-18 20:21:00

2

如果你想保持流处处处处处处处处处处处处处处处处处处处处处处处处处处处,避免分配大量的字节数组,这是很好的做法(例如,如果你打算发布大文件),你仍然可以使用派生版本的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; 
} 

这里是定制的Web客户端:

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; 
    } 
} 
相关问题