在WCF客户端中查找Stream对象的长度?

Kis*_*mar 3 .net c# wcf stream

我有一个WCF服务,它使用Stream类上传文档.

在此之后,我想获取文档的大小(流的长度),以更新FileSize的fileAttribute.

但是这样做,WCF引发了一个例外

Document Upload Exception: System.NotSupportedException: Specified method is not supported.
   at System.ServiceModel.Dispatcher.StreamFormatter.MessageBodyStream.get_Length()
   at eDMRMService.DocumentHandling.UploadDocument(UploadDocumentRequest request)
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题.

Mar*_*ell 6

在此之后,我想获取文档的大小(流的长度),以更新FileSize的fileAttribute.

不,不要那样做.如果您正在编写文件,则只需编写该文件即可.最简单的:

using(var file = File.Create(path)) {
    source.CopyTo(file);
}
Run Code Online (Sandbox Code Playgroud)

或者在4.0之前:

using(var file = File.Create(path)) {
    byte[] buffer = new byte[8192];
    int read;
    while((read = source.Read(buffer, 0, buffer.Length)) > 0) {
        file.Write(buffer, 0, read);
    }
}
Run Code Online (Sandbox Code Playgroud)

(不需要事先知道长度)

请注意,一些WCF选项(完整的消息安全性等)要求在处理之前验证整个消息,因此永远不能真正流式传输,因此:如果大小很大,我建议您改为使用客户端拆分并发送它的API碎片(然后在服务器上重新组装).

  • 在这种情况下,@ TheIndianProgrammmer,*你正在使用错误的流*.例如:有人给你一个软管的业务结束 - 现在回答:有多少水?找出的唯一方法是让它流动*.你附上一个仪表,然后:要么把它倒掉而且它已经消失了,或者你必须把它全部放在一个巨大的桶里.大多数溪流都不知道它们的长度. (2认同)