基於WCF在普通的編碼是以文本編碼方式在信道之間傳輸信息的,這種編碼會把所有的二進制信息以字節數組的形式存儲,並以Base64進行編碼,而Base64則是用三個字節來儲存4 個字符信息。使得數據量增大約30%以上。在WCF中引入了壹種專門針對數據流進行優化編碼的MTOM模型。下面我們使用編碼模型和調用模型三種方式來改寫文件流的傳輸,以提高WCF應用程序的性能。
1、 MTOM模型:
這模型在於將SOAP消息編碼成SOAP MT OM(消息傳輸優化機制)編碼。這種編碼是為那些包含大量的二進制數據的SOAP消息而做的,它是把數據流作為SOAP消息的附件而添加的。所以利用這種編碼在傳輸信道之間傳輸可以顯著提高傳輸性能。在WCF中MTOM模型的操作契約中只能使用單個Stream對象作為參數或者返回類型。
這種模型的特點如圖所示:
1.1實現服務契約
服務契約是服務所支持的操作、使用的消息交換模式和每壹則消息的格式,它控制消息被格式化的方式,在這裏由於要使用MTOM編碼消息,所以在操作契約中必須要以單壹的Stream對象為輸入輸出參數。所以這兒我們把服務定義為如下的形式:
[ServiceContract]
public interface ISendStreamService
{
[OperationContract]
void SendStream(Stream stream);
//這個方法的是為了傳遞文件的參數而設的
[OperationContract]
void FileNameSetting(string filename, string destinationpath);
}
另外我們還定義了壹個傳輸文件路徑的名稱的輔助方法:FileNameSetting();
1.2實現服務器方法
在上面定義了公***的接口後,接下來我們就實現接口的方法,主要的方法的目的是為了傳輸Stream對象,由於Stream是壹個抽象類,所以這兒以文件流為操作對象來使用SendStream()這個方法。
1.3客戶通過接口調用服務器方法
客戶端調用服務器方法至少有三種,這裏我們選擇工廠方法來實現,System.ServiceMode.Channel.ChannelFactory<T>類是這個信道工廠類,它的方法CreateChannel()可以創建T的實例。
ISendStreamService proxy=new
ChannelFactory<ISendStreamService>(“WSHttpBinding_ISendStreamService”).Create-
Channel();
proxy.FileNameSetting(file.Substring (file.LastIndexOf ("\\")+1), filePath);
proxy.SendStream(inStream);
1.4服務器和客戶端的配置信息
配置信息定義了雙方通信的終結點、綁定、契約行為及其他的配置如安全,可靠性等。服務器的配置如:
<service behaviorConfiguration="SendStreamServiceBehavior"
name="SendStreamService">
<endpoint address=" http://localhost:5504/WebSite2/ISendStreamService "
binding="wsHttpBinding" bindingConfiguration="MTMOBinding"
contract="ISendStreamService">
</endpoint>
<bindings>
<wsHttpBinding>
<binding name="MTMOBinding" messageEncoding="Mtom">
</wsHttpBinding>
</bindings>
</service>