Stream CanRead / CanSeek false + Length& Position抛出异常NotSupportedException

时间:2018-02-06 11:30:14

标签: c# post stream webrequest

我是新手,我想做的是将图像作为字节数组发布到URL,但是当我尝试获得响应时出现错误。

以下是MSDN的代码:

// Create a request using a URL that can receive a post.   
 WebRequest request = WebRequest.Create(BASE_URL);
 // Set the Method property of the request to POST.  
 request.Method = "POST";
 // Create POST data and convert it to a byte array.
 byte[] byteArray = fileContent; // my image as bytearray
 // Set the ContentType property of the WebRequest.  
 request.ContentType = "application/x-www-form-urlencoded";
 // Set the ContentLength property of the WebRequest.  
 request.ContentLength = byteArray.Length;
 // Get the request stream.  
 Stream dataStream = request.GetRequestStream();
 // Write the data to the request stream.  
 dataStream.Write(byteArray, 0, byteArray.Length);
 // Close the Stream object.  
 dataStream.Close();
 // Get the response.  
 WebResponse response = request.GetResponse(); // here it stops
 // Display the status.  
                Console.WriteLine(((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.  
dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.  
StreamReader reader = new StreamReader(dataStream);
// Read the content.  
string responseFromServer = reader.ReadToEnd();
// Display the content.  
Console.WriteLine(responseFromServer);
// Clean up the streams.  
reader.Close();
dataStream.Close();
response.Close();

在Stream,CanRead和CanSeek中调试时为false,而Length和Position都抛出相同的错误:

  

'((System.Net.ConnectStream)数据流)。长度'抛出一个例外   键入' System.NotSupportedException'。

我尝试复制到内存流,但同样的问题。我在互联网上找到的任何东西都没有帮助我解决这个问题。

1 个答案:

答案 0 :(得分:2)

关于调试

这是NetworkStream

的正常行为
  

NetworkStream不支持随机访问网络数据   流。 CanSeek属性的值,表示是否为   流支持寻求,总是假的;阅读立场   property,读取Length属性或调用Seek方法会   抛出NotSupportedException。

关于您的MSDN示例

请参阅WebRequest.GetResponse

笔记说明

  

如果抛出WebException,请使用的Response和Status属性   确定服务器响应的异常。

虽然有很多方法可以使用WebRequest

将这个包装在try catch中并计算实际异常是什么以及它告诉你的内容是值得的

try
{
    WebResponse response = request.GetResponse(); 

    ...
    ...
}
catch(WebException ex)
{
    // inspect Response and Status properties
}