我有一个与我服务器上的WCF服务通信的Silverlight(v3)应用程序。 Silverlight应用程序执行的操作之一是请求动态生成的数据文件 - 此数据文件由服务创建,并且需要(最终)通过SaveFileDialog保存在本地用户的计算机上。
我的问题是,获取此文件的Silverlight中最好的方法是什么?有问题的文件可能非常大。
任何帮助都将不胜感激。
答案 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一样。
马克