所以我有一个返回pdf流的函数。调用过程获取流并将其写入磁盘(感谢 ServiceGuy!普通VB代码如下:
Public Function GetPDF() As System.IO.FileStream
GetPDF = File.OpenRead("C:Documents and Settingsjspel903Desktop3211LD.pdf")
End Function
现在,无论出于何种原因,当我将该代码放入 WCF(见下文)并生成/安装时,它都不会返回任何内容。在 Windows 服务中承载我的 WCF 后,调用过程将不获取任何内容(我无法对其进行调试或单步执行)。所以我想知道,也许,WCF 不会返回文件流?
以下是服务:
<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 Settingsjspel903Desktop3211LD.pdf")
End Function
End Class
在我看来,它应该有效。有什么想法吗?
您可能希望将FileStream转换为字节数组并返回该数组。 WCF 通常仅限于返回可序列化的类型。
// fs is your FileStream
byte[] Data = new byte[fs.Length];
fs.Read(Data,0,fs.Length);
这是行不通的...想想如果它这样做意味着什么。 WCF 客户端将有权访问服务器设备上的文件流。 它必须能够通过远程连接在本地执行所有操作。
WCF 是数据的传输机制,它实际上不会将对象引用发送到服务器的对象。 客户端获取对象的副本,该副本已由服务器序列化,然后在客户端反序列化。 如果可以发送流对象,则文件句柄/内存引用等对接收客户端没有任何意义。
您需要从服务器上的流中读取数据,然后将其转换为适当的数据对象以传输回客户端。
编辑:
显然,您可以将流式处理与 WCF 一起使用,但您将无法返回 System.IO.FileStream,您可以返回 Stream。
查看: 大数据和流式处理 有关描述以及采用该方法时需要注意的一些限制。