3

我有一个 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)

谁能帮我解决这个问题。

4

2 回答 2

6

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

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

using(var file = File.Create(path)) {
    source.CopyTo(file);
}

或 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);
    }
}

(不需要提前知道长度)

请注意,某些 WCF 选项(完整的消息安全性等)需要在处理之前验证整个消息,因此永远无法真正进行流式传输,因此:如果大小很大,我建议您改用 API,客户端将其拆分并发送它分段(然后您在服务器上重新组装)。

于 2012-08-07T15:10:53.463 回答
0

如果流不支持查找,则无法使用Stream.Length

另一种方法是将流复制到一个字节数组并找到它的累积长度。这涉及到首先处理整个流,如果你不想要这个,你应该在你的 WCF 服务接口中添加一个流长度参数

于 2012-08-07T14:52:50.760 回答