我正在編寫一個需要傳輸大文件的WCF服務,所以我使用流式傳輸,但從另一方面我需要執行用戶名特定的初始化。有沒有辦法在netTcpBinding中啓用會話和流媒體?
問題是獲取用戶名並每次執行初始化都非常昂貴。如果我可以打開會話,我可以將初始化的數據保存在服務實例中的本地變量中。
有沒有辦法打開netTcpBinding流和會話?
我正在編寫一個需要傳輸大文件的WCF服務,所以我使用流式傳輸,但從另一方面我需要執行用戶名特定的初始化。有沒有辦法在netTcpBinding中啓用會話和流媒體?
問題是獲取用戶名並每次執行初始化都非常昂貴。如果我可以打開會話,我可以將初始化的數據保存在服務實例中的本地變量中。
有沒有辦法打開netTcpBinding流和會話?
大文件傳輸的確是wcf中的一個問題,流選項並不能解決任何問題(甚至需要更多的服務器內存)。
如果你不想使用套接字,可以解決實現你自己的「協議」的問題,以塊分割文件,並只傳輸單獨的塊。我使用了可靠的Sesions和TransportWithMessageCredential。
服務器(或客戶端)界面看起來是這樣的:
[ServiceContract(CallbackContract = typeof(IClient), SessionMode = SessionMode.Required)]
public interface IServer
{
[OperationContract]
FilePart GetFileChunk(string identifier, int number, int blockSize);
}
正如DataContract你可以使用這樣的事情:
[DataContract]
public class FilePart
{
[DataMember] public int Part;
[DataMember] public byte[] Data;
[DataMember] public int BlockSize;
}
要發現你有「正確的」塊大小玩一下,我推薦約64-512 kb的東西。當它們太小時,你有很多請求,當它們變大時,它變得很慢,並且在服務器端有更多的負載。
maxReceivedMessageSize,maxBufferSize和超時時間足夠長(在綁定配置中)和讀者配額也很重要。對於測試,我建議使用所有字段的最大值,當它工作時使用更適合的值。
如果您使用雙工綁定,則可以通過參考傳遞對象。藉助這種方式,您可以通過回調對象,這樣你就能夠更好地查看傳送等的進展...
[OperationContract IsOneWay=true]
FilePart GetFileChunk(string identifier, int number, int blockSize, ref TransferState callback);
我想這是所有技巧和提示我可以給。我希望它有幫助。
我不認爲WCF適合傳輸大文件 - 儘量使用System.Net.Sockets,儘管WCF基於它們。
你會認爲「大」的尺寸是多少? – flayn 2010-02-11 15:49:20
這取決於你想要建立什麼......使用正確的配置,你可以傳輸大於50MB的文件而不需要分割文件,但你必須激活wcf流選項。使用流選項時,服務器上的內存消耗高於傳輸基於消息的文件塊,因此如果您必須處理高負載,則分割可能是更好的方法。 – CaptainPlanet 2010-02-17 10:28:15