2009-09-30 54 views
1

我有一個與我的服務器上的WCF服務通信的Silverlight(v3)應用程序。 Silverlight應用程序所做的一件事是請求一個動態生成的數據文件 - 該數據文件由服務創建,並且需要(最終)通過SaveFileDialog保存在本地用戶的計算機上。Silverlight應用程序請求WCF服務中的文件

我的問題是,Silverlight獲取此文件的最佳方式是什麼?相關文件可能相當大。

任何幫助,將不勝感激。

回答

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一樣。

Marc

相關問題