Silverlight应用程序从WCF服务请求文件

时间:2009-09-30 23:33:47

标签: wcf silverlight

我有一个与我服务器上的WCF服务通信的Silverlight(v3)应用程序。 Silverlight应用程序执行的操作之一是请求动态生成的数据文件 - 此数据文件由服务创建,并且需要(最终)通过SaveFileDialog保存在本地用户的计算机上。

我的问题是,获取此文件的Silverlight中最好的方法是什么?有问题的文件可能非常大。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您已经知道所请求的文件可能非常大,那么您可能希望为此请求创建自己的特定端点,该端点支持流式传输。

因此,您将拥有一个用于“普通”方法调用的常规端点(例如http://yourserver:8080/YourService)和第二个端点(http://yourserver:8085/YourService),它将支持流式传输以使用合理的内存开销。

配置它应该相当简单 - 无论是在服务器还是客户端,您都需要指定一个绑定配置来支持流式传输:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="streamed"
               transferMode="StreamedResponse" />
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="YourService">
      <endpoint name="normal" 
                address="http://yourserver:8080/YourService"
                binding="basicHttpBinding"
                contract="IYourServiceContract" />
      <endpoint name="filetransfer" 
                address="http://yourserver:8085/YourService"
                binding="basicHttpBinding"
                bindingConfiguration="streamed"
                contract="IYourServiceContract" />
    </service>
  </services>
</system.serviceModel>

在客户端上,当然,您必须在<client>标记内包含两个端点,否则一切都应该相同。

“transferMode”默认为“缓冲”,例如整个消息被缓冲并在一个块中发送。

您的其他选项是“流式传输”(双向流式传输),“StreamedRequest”(如果您有非常大的请求)或“StreamedResponse”(如果仅响应,则传输的文件非常大)。

在这种情况下,您的服务上只有一个方法可以返回(即文件)。从您的客户端,当您调用此服务方法时,您将返回一个流,然后您可以读取块,就像MemoryStream或FileStream一样。

马克