整理了幾個WCF裡幾個基本知識點:
1、WCF中的Message
WCF中的訊息對象Message,是有狀態的。它的狀態是MessageState枚舉。共有以下幾種類型:
public enum MessageState
{
Created,
Read,
Written,
Copied,
Closed
}
對Message對象,只有在Create狀態下,才能讀,否則讀取會有異常。Message
同樣定義了許多Write之類的方法,這些Write方法同樣也只能用於處於Created的訊息。
在WCF中,有可能需要對訊息進行一些讀取、等操作。但是讀取操作會改變Message的
狀態,導致再次讀取會有異 常。這時,可以使用Message定義的CreateBufferedCopy方法。
它的簽名如下:
public MessageBuffer CreateBufferedCopy(int maxBufferSize);
它返回的是MessageBuffer對象,它能進行多次Create而返回Message對象,並且Message的狀態為Created。
2、WCF中的訊息編碼格式:Text、MTOM、Binary。Text格式是與平台無關的;MTOM,基於WS-*MTOM規範,是
大資料量位元據以SOAP傳輸時最佳化使用的格式,也與平台無關;Binary是以二進位格式編碼,
只用於.Net平台上。
3、中繼資料交換終結點中繼資料交換終結點是一類特殊的終結點,也成為MEX 終結點,它支援中繼資料交換的標準;
服務可以根據他發布自己的中繼資料。
對於WebService來說,它是通過WSDL的方式發布中繼資料,這樣對於WebService來說,
是自動發布服務的中繼資料資訊,於是我們可以通過WSDL工具產生WebService的代理類。
在WCF中,服務是可以選擇不發布中繼資料資訊的,即使是對於它所支援跨平台HTTP協議。
但是我們可以通過發布中繼資料交換終結點,產生服務的代理。
WCF自動為服務宿主自動提供了IMetadataExchange介面的實現。對於中繼資料交換終結點,
WCF提供了專門的繫結元素用以對不同的協議(如:HTTP、TCP、IPC)的支援。如HTTP則對應
mexHttpBinding;對於Tcp則對應mexTcpBinding;對於IPC則對應mexNamedPipeBinding。
以下就是對於HTTP、TCP、IPC這幾種協議下中繼資料交換終結點的配置:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Service.CalculatorService" behaviorConfiguration="mex">
<host>
<baseAddresses>
<add baseAddress="net.tcp://127.0.0.1:3636/mexTcp" />
<add baseAddress="http://127.0.0.1:6363/mexHttp"/>
<add baseAddress="net.pipe://127.0.0.1"/>
</baseAddresses>
</host>
<endpoint address="net.tcp://localhost:3636/SessionfulCalculator" binding="netTcpBinding" contract="Contract.ICalculator"></endpoint>
<endpoint address="http://localhost:6363/SessionfulCalculator" binding="wsHttpBinding" contract="Contract.ICalculator"></endpoint>
<endpoint address="netpipe" binding="netNamedPipeBinding" contract="Contract.ICalculator"></endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"> </endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"> </endpoint>
<endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange"> </endpoint>
</service>
</services>
</system.serviceModel>
這樣,不管服務所支援的HTTP、TCP、IPC等方式,我們都可以通過SVCUtil工具組建代理程式類
進而訪問服務。
在WCF中,對於HTTP協議而言,我們可以通過直接佈建服務的行為,通過httpGetEnabled="true"
的方式來發布服務的中繼資料資訊,而它不支援其他協議;對於其他協議我們希望發布中繼資料資訊,
通過配置的方式顯然是一種很好的方式。
對於中繼資料交換終結點配置,如:<endpoint address="mex" binding="mexNamedPipeBinding"
contract="IMetadataExchange"></endpoint>
如果address配置為空白或者與behavior中 name配置相同,則可以直接通過SVCUtil加上
baseAddress組建代理程式類。如:
如果address和behavior中 name配置不同則組建代理程式類時SVCUtil 需要加上baseAddress +
<endpointaddress="mex" binding="mexNamedPipeBinding"contract="IMetadataExchange" />
中的address的屬性值。如 :
使用中繼資料交換終結點時,如果服務所支援的終結點綁定支援HTTP協議,不論如下配置:<behavior name="mex">
<serviceMetadata httpGetEnabled="false"/>
</behavior>
中httpGetEnabled的值如何,都能組建代理程式類。