那麼,你真的觸及到兩個不同的問題:
- 本地與遠程服務的可用性
- 「正常」 與流媒體服務(大文件)
一般情況下,如果您的服務在LAN上的公司防火牆後面工作,則應該使用NetTcpBinding,因爲它是最快和最高效的。它速度快,效率高,因爲它使用二進制消息編碼(而不是互聯網上的文本消息編碼)。
如果你必須爲「外部」世界提供服務,你應該嘗試使用盡可能互操作的綁定,而在這裏你的選擇是basicHttpBinding(完全可互操作 - 「舊」的SOAP 1.1協議),它不能擔保太多,wsHttpBinding提供了更多的靈活性和選擇,但支持程度較低。
既然你可以輕鬆地與三個端點創建一個單獨的服務,你真的可以創建你的服務,然後定義這三個端點:一個爲本地客戶使用NetTcpBinding的,使用basicHttpBinding的最廣泛的可用性之一,並且可選另一個用的wsHttpBinding 。
這是故事的一面。另一個是:對於你的「正常」服務調用,交換幾條信息(大小可達幾KB),你應該使用正常的「緩衝傳輸」默認行爲 - 消息是完全準備好的在緩衝區中並作爲一個整體發送。
但是,對於處理大文件,最好使用流式傳輸模式 - 如果您希望客戶端能夠從服務器下載文件,請使用「StreamedResponse」;如果您希望客戶端使用「StreamedRequest」能夠上傳文件,或者如果您以兩種方式發送文件,只是簡單的「流式傳輸」。
因此,除了三個「常規」端點之外,每個綁定應至少有另一個端點來處理數據的流式交換,即上載/下載文件。
這可能看起來像很多不同的端點 - 但這確實不是問題,您的客戶端可以連接到適合他們的任何端點 - 常規vs.流和內部/本地(netTcpBinding)與外部(basicHttpBinding),因爲他們需要 - 最後,你只寫一次代碼!
啊,WCF的美麗! :-)
馬克
UPDATE:
OK,您的評論後,這是我會做什麼:
- 創建一個單一的方法
GetFile
一個返回一個ILocalService
服務合同路徑和文件名
- 創建服務合同的實施
- 主機上的服務端點
netTcpBinding
(因爲它的內部,本地)
[ServiceContract]
interface ILocalService
{
[OperationContract]
string GetFile(......(whatever parameters you need here).....);
}
class LocalService : ILocalService
{
string GetFile(......(whatever parameters you need here).....)
{
// do stuff.....
return fileName;
}
}
其次:
- 創建第二個合同
IRemoteService
服務與單一方法GetFile
不返回文件名作爲字符串,而是返回流
- 創建服務合同的實施
- 主機上
basicHttpBinding
端點互聯網使用該服務
- 確保有
transferMode="StreamedResponse"
在您綁定的配置,使流回文件
[ServiceContract]
interface IRemoteService
{
[OperationContract]
Stream GetFile(......(whatever parameters you need here).....);
}
class RemoteService : IRemoteService
{
Stream GetFile(......(whatever parameters you need here).....)
{
// do stuff.....
FileStream stream = new FileStream(....);
return stream;
}
}
這聽起來像你有一個WCF服務,這需要你寫入本地文件系統。您仍然可以使用流式傳輸或分塊將文件的數據發送到服務。我不是說你談論的本地和遠程之間的差異是什麼? – RichardOD 2009-10-13 19:38:50