【问题标题】:WCF Function won't return streamWCF 函数不会返回流
【发布时间】:2011-05-11 20:45:03
【问题描述】:

所以我有一个返回 pdf 流的函数。调用过程获取流并将其写入磁盘(感谢 ServiceGuy!)。正常的VB代码如下:

Public Function GetPDF() As System.IO.FileStream

    GetPDF = File.OpenRead("C:\Documents and Settings\jspel903\Desktop\3211LD.pdf")

End Function

现在,无论出于何种原因,当我将该代码放入我的 WCF(见下文)并构建/安装时,它都不会返回任何内容。在我的 WCF 托管在 Windows 服务中之后,调用过程一无所获(我无法对其进行调试或单步执行)。所以我想知道 WCF 是否不会返回 FileStream?

这是 IService:

<ServiceContract()> _
Public Interface IService1

<OperationContract()> _
Function GetPDF() As System.IO.FileStream
'Should return a .pdf file as a stream

End Interface

这是 svc:

Imports System.IO

Public Class Service1
Implements IService1


Public Function GetPDF() As System.IO.FileStream Implements IService1.GetPDF

    GetPDF = File.OpenRead("C:\Documents and Settings\jspel903\Desktop\3211LD.pdf")

End Function
End Class

在我看来它应该可以工作。有什么想法吗?

【问题讨论】:

  • 您是否将 Binding 的 TransferMode 设置为 StreamedResponse?您能否也发布您的配置(&lt;system.serviceModel&gt; 部分)?

标签: vb.net wcf function filestream


【解决方案1】:

您可能希望将 FileStream 转换为字节数组并返回。 WCF 通常仅限于返回可序列化类型。

   // fs is your FileStream

   byte[] Data = new byte[fs.Length];

   fs.Read(Data,0,fs.Length);

【讨论】:

  • 你不能流式传输字节数组,所以如果你要移动非常大的数据块,你可能会遇到一些严重的性能问题。 WCF 中的流式处理确实有效,他可能只是配置错误。
  • 是的,但我认为如果他只想通过 WCF 提供 PDF,那么字节数组是有意义的。不确定“流”是否真的是他问题的关键。
  • 嗯,是的。如果它们是正常大小的 PDF,那么它可能无关紧要。 :)
  • 老实说(现在这个帖子里有 2 个 Jason,我是寻求建议的人)-- 全部内容都在这里:stackoverflow.com/questions/5970730/…
  • WCF 支持流作为输入和输出参数。 docs.microsoft.com/en-us/dotnet/framework/wcf/samples/stream
【解决方案2】:

它不会起作用...想想如果它起作用会意味着什么。您的 WCF 客户端将有权访问您的服务器设备上的文件流。它必须能够通过远程连接执行您可以在本地执行的所有操作。

WCF 是一种数据 的传输机制,它实际上并不向服务器的对象发送对象引用。客户端获取对象的副本,该副本已由服务器序列化,然后在客户端反序列化。如果您可以发送一个流对象,则文件句柄/内存引用等对接收客户端没有任何意义。

您需要从服务器上的流中读取数据,然后将其转换为适当的数据对象以传输回客户端。

编辑:

显然您可以将流与 WCF 一起使用,但您将无法返回 System.IO.FileStream,您可以返回 Stream。

查看:Large Data And Streaming 以获取说明以及采用这种方法时需要注意的一些限制。

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2011-02-14
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多