C# Stream.Length抛出NotSupportedException

C# Stream.Length抛出NotSupportedException,c#,.net,stream,notsupportedexception,C#,.net,Stream,Notsupportedexception,尝试对发送到WCF方法中的流对象执行stream.Length时出错 Unhandled Exception! Error ID: 0 Error Code: Unknown Is Warning: False Type: System.NotSupportedException Stack: at System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream.get_Length() 你是如何得到这条河的长度

尝试对发送到WCF方法中的流对象执行stream.Length时出错

Unhandled Exception!
 Error ID: 0
 Error Code: Unknown
 Is Warning: False
 Type: System.NotSupportedException
 Stack:    at System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream.get_Length()

你是如何得到这条河的长度的?有什么例子吗?

您不能总是得到流的长度。例如,在网络流的情况下,找出长度的唯一方法是从其中读取数据,直到关闭为止

你想干什么?您是否可以从流中读取数据,直到其耗尽,并在运行时将数据复制到
内存流中?

仅适用于搜索可用的流实现。你通常可以检查一下这是不是真的。许多溪流,因为它们是流动的,其性质是不可能提前知道长度的


如果必须知道流的长度,则可能需要实际缓冲整个流,并提前将其加载到内存中。

如果流不支持查找,则不一定能够获得流的长度。请参阅上的异常表

例如,连接到另一个进程(网络流、标准输出等)的流可以产生任意数量的输出,这取决于另一个进程是如何编写的,框架无法计算出有多少数据

在一般情况下,您只需在流结束前读入所有数据,然后计算您已读取的数据量。

TcpClient.EndRead()应返回流中的字节数


--编辑,当然您需要使用TCP流

我在使用WCF服务时遇到了同样的问题。我需要获取POST消息的内容,并在方法中使用
参数来获取消息正文的内容。一旦我得到了流,我想一次读取它的所有内容,并且需要知道我需要的字节数组的大小。因此,在数组的分配中,我将调用
System.IO.Stream.Length
并获得OP提到的异常。您需要知道流的长度以便读取整个流的内容,这是原因吗

实际上,您可以使用
System.IO.StreamReader
将流的全部内容读入字符串。如果您仍然需要知道流的大小,您可以获得结果字符串的长度。以下是我如何解决此问题的代码:

    [OperationContract]
    [WebInvoke(UriTemplate = "authorization")]
    public Stream authorization(Stream body)
    {
        // Obtain the token from the body
        StreamReader bodyReader = new StreamReader(body);
        string bodyString = bodyReader.ReadToEnd();
        int length = bodyString.Length; // (If you still need this.)
       // Do whatever you want to do with the body contents here. 
    }
我就是这么做的:

//返回没有可用长度属性的流的长度
公共静态长GetStreamLength(流)
{
长原始位置=0;
长totalBytesRead=0;
if(stream.CanSeek)
{
原始位置=流位置;
流位置=0;
}
尝试
{
字节[]读缓冲区=新字节[4096];
int字节读取;
而((bytesRead=stream.Read(readBuffer,04096))>0)
{
totalBytesRead+=字节读取;
}
}
最后
{
if(stream.CanSeek)
{
流位置=原始位置;
}
}
返回totalBytesRead;
}

流类是抽象的,您使用的派生流类是什么?另外,如果可能的话,发布导致问题的代码?@Nevin:流还发生了什么?基本上,如果不通过读取来更改状态,您将无法获取此信息。警告:如果您的文件大小可能超过2 GB(~
int.MaxValue
),请使用
long
for
totalBytesRead
),键入
long
HttpClient.GetStreamAsync(url)
?它将设置Length属性,但不可查找。我是否必须使用try-catch-then测试Stream.Length属性的值?@BrunoZell在HTTP请求/响应流的情况下:
Content-Length
头不能被信任(“永远不要信任[client |管道的另一端]!”):连接可能会中止,或者服务器可能会在TCP连接上推送比客户端预期更多的数据。