3

我有一个 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 的新手

4

1 回答 1

2

再会!

引用《Programming WCF Services》作者 Juval Lowy 一书的话:

默认情况下,当客户端和服务交换消息时,这些消息会在接收端进行缓冲,只有在整个消息接收完毕后才会传递。无论是客户端向服务发送消息还是服务向客户端返回消息都是如此。因此,当客户端调用服务时,只有在客户端的消息全部收到后才会调用服务;同样,只有在完整接收到带有调用结果的返回消息后,客户端才会解除阻塞。对于足够小的消息,这种交换模式提供了一个简单的编程模型,因为与消息处理本身相比,接收消息引起的延迟通常可以忽略不计。然而,当涉及到更大的消息(例如涉及多媒体内容、大文件或批量数据的消息)时,在收到整条消息之前进行阻止可能是不切实际的。为了处理这种情况,WCF 允许接收方(无论是客户端还是服务)在通道仍在接收消息时开始处理消息中的数据。这种类型的处理称为流传输模式。对于大负载,流式传输提供了改进的吞吐量和响应能力,因为在发送或接收消息时,接收方和发送方都不会被阻塞 WCF 使接收方(无论是客户端还是服务)能够在通道仍在接收消息时开始处理消息中的数据。这种类型的处理称为流传输模式。对于大负载,流式传输提供了改进的吞吐量和响应能力,因为在发送或接收消息时,接收方和发送方都不会被阻塞 WCF 使接收方(无论是客户端还是服务)能够在通道仍在接收消息时开始处理消息中的数据。这种类型的处理称为流传输模式。对于大负载,流式传输提供了改进的吞吐量和响应能力,因为在发送或接收消息时,接收方和发送方都不会被阻塞

对于传输文件,我建议使用带有异步模式的 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>
于 2013-10-23T20:28:12.520 回答