【问题标题】:Find Length of Stream object in WCF Client?在 WCF 客户端中查找流对象的长度?
【发布时间】:2012-08-04 14:55:15
【问题描述】:

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

谁能帮我解决这个问题。

【问题讨论】:

  • 您应该从客户端发送Length
  • 我无法从客户端发送 FileSize,因为没有专门的属性

标签: c# .net wcf stream


【解决方案1】:

在此之后,我想获取文档的大小(流的长度),以更新 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,客户端将其拆分并分段发送(然后您在服务器上重新组装)。

【讨论】:

  • 我无法使用 .net 4.0,我使用的是 3.5
  • 如果你没有CopyTo 然后实现你自己的byte[] buffer = new byte[4096]; for(int byteCount = source.Read(buffer, 0, 4096); byteCount != 0; byteCount = source.Read(buffer, 0, 4096)file.Write(buffer, 0, byteCount); 4096 是内存页面大小,所以它往往做得很好,你不想超过两倍大多数,或者你在浪费内存没有任何收获。
  • @TheIndianProgrammmer(叹气)好吧,大约需要手动执行 4 行代码……一会儿……
  • 我没有在任何地方写文件.. 我更关心从流中知道文件大小
  • @TheIndianProgrammmer 在这种情况下,您使用的流错误。例如:有人给你软管的业务端 - 现在回答:有多少水?找出答案的唯一方法是让它流动。你附上一个仪表,然后:要么把它倒掉,它就永远消失了,或者你必须把它全部缓冲在某个地方的一个巨大的桶里。大多数流不知道它们的长度。
【解决方案2】:

如果流不支持查找,则使用 Stream.Length 找不到它的长度

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

【讨论】:

  • 如果文件很大,获取 byte[] 是一个繁重的过程
  • @TheIndianProgrammmer 这正是你应该将其视为Stream 的原因;p 你不需要知道这样做的长度。或者:调用者可以将文件分块并分多块发送。
  • 没错,如果你要将它保存为文件,你关心它之前的大小是什么?您不想一次在内存中使用超过 4-8k 的块。如果要设置最大文件大小,请复制到最大文件大小,然后删除文件并在命中时中止。
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多