我有一个WCF服务,我希望其服务方法之一访问pdf文件并将其转换为流或其他东西并将流返回到我的Web应用程序,我将把该流转换回一个pdf文件。
哪种方法更好,将pdf转换为Stream
或byte[]
数组?
这是我的方法
public byte[] GetPdf(string Address)
{
byte[] bytes = System.IO.File.ReadAllBytes(Address);
return bytes
}
现在在我调用此WCF服务的Web应用程序中,我想使用这些字节并将它们转换回pdf。这是正确的方法,因为我不确定将文件作为流返回正确还是返回byte[]
是正确的
但是当我为测试目的运行服务时,我收到了错误
已超出传入邮件的最大邮件大小限额(65536)。要增加配额,请在相应的绑定元素上使用MaxReceivedMessageSize属性。
我如何解决这个问题,我没有添加任何绑定或任何东西,一切都是默认的,因为我是WCF的新手
答案 0 :(得分:2)
美好的一天!
引用书籍“Programming WCF Services”作者Juval Lowy:
默认情况下,当客户端和服务交换消息时, 这些消息在接收端缓冲并传送 只有在收到整个邮件后才会收到。这是真的 无论是客户端向服务发送消息还是发送消息 服务将消息返回给客户端。结果,当 客户端调用该服务,该服务仅在调用之后调用 客户的消息已全部收到;同样地, 只有返回的消息带有结果后,客户端才会被解除阻止 已完全收到调用。足够了 小消息,这种交换模式提供了一个简单的程序 - ming模型,因为接收消息引起的延迟是 与消息处理本身相比通常可以忽略不计。 但是,当涉及更大的消息时 - 例如涉及的消息 多媒体内容,大文件或批量数据阻止,直到 收到的整条信息可能不切实际。处理 在这种情况下,WCF启用接收方(无论是客户端还是客户端) service)在消息开始处理消息中的数据 仍在接收该频道。这种处理方式是 称为流传输模式。使用大型有效负载,流式传输 提供了更高的吞吐量和响应能力 在消息出现时,接收或发送方被阻止 发送或接收
对于传输文件,我推荐使用带有异步模式的Stream。
[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface ITerrasoftFiles
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginGetFiles(Guid ID, AsyncCallback asyncCallBack, object asyncState);
Stream EndGetFiles(IAsyncResult res);
[OperationContract]
FileInfo GetFileInfo(Guid ID);
}
在Web.config中设置 transferMode =“StreamedResponse”
<bindings>
<netTcpBinding>
<binding name="tcpTerrasoftFiles" transferMode="StreamedResponse">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="TWebServices.Services.TerrasoftFiles">
<endpoint address=""
binding="netTcpBinding" bindingConfiguration="tcpTerrasoftFiles"
contract="TWebServices.Services.ITerrasoftFiles" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>