C# WCF服務(三)

目錄

 

WCF配置文件

服務配置的主要部分

WCF的通信模式

請求與答覆模式

單向模式

雙工模式


WCF配置文件

配置也是WCF編程中的主要組成部分。在以往的.net應用程序中,我們會把DBConn和一些動態加載類及變量寫在配置文件裏。但WCF有所不同。他指定向客戶端公開的服務,包括服務的地址、服務用於發送和接收消息的傳輸和消息編碼,以及服務需要的安全類型等。使用配置文件後,我們無需編譯即可修改WCF的變化的信息,提高了程序的靈活性。

如果在代碼裏寫了配置,那麼配置文件將不起作用。

Web程序在Web.config中配置,應用程序中在App.config中配置。

服務配置的主要部分

在Config中配置服務的結點爲:<system.serviceModel></system.serviceModel>,在這個節點中主要有三個平級的部分。如下代碼所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <!--配置服務和終結點開始-->
    <services>
      <service>
        <endpoint></endpoint>
      </service>
    </services>
    <!--配置服務和終結點結束-->
    
    <!--配置綁定開始-->
    <bindings>
      <netTcpBinding>
        <binding></binding>
      </netTcpBinding>
    </bindings>
    <!--配置綁定結束-->
      
    <!--配置行爲開始-->
    <behaviors>
      <serviceBehaviors>
        <behavior>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!--配置行爲結束-->
  </system.serviceModel>
</configuration>

Service配置節[必須有]:配置服務、接口和終結點。每個Service都會有以下兩個屬性。name:名稱空間.類名[服務的具體實現類]。behaviorConfiguration:一個在behaviors節點中找到的名稱。

Binding配置節[可有可無]:配置綁定,如http,tcp等。

Behavior配置節[可有可無]:配置行爲,如認證等。

WCF的通信模式

WCF在通信過程中有三種模式:請求與答覆、單向、雙工通信。

請求與答覆模式

客戶端發送請求,然後一直等待服務端的響應(異步調用除外),期間處於假死狀態,直到服務端有了答覆後才能繼續執行其他程序,如下圖所示(圖中的粗紅線在此時代表順序並不代表調用):

請求與答覆模式爲WCF的默認模式,如下代碼所示:

[OperationContract]
string ShowName(string name);

即使返回值是void 也屬於請求與答覆模式。

缺點:如果用WCF在程序A中上傳一個2G的文件,那麼要想執行程序B也許就是幾個小時後的事情了。如果操作需要很長的時間,那麼客戶端程序的響應能力將會大大的下降。

優點:有返回值我們就可以向客戶端返回錯誤信息,如:只接收".rar"文件等信息。

單向模式

客戶端向服務端發送求,但是不管服務端是否執行完成就接着執行下面的程序。如下圖所示:

單向模式要在OpertaionContract的屬性中顯示設置值,代碼如下:

[OperationContract(IsOneWay = true)]
void ShowName(string name);

優缺點與“請求響應模式”差不多倒過來。

特點:使用 IsOneWay=true 標記的操作不得聲明輸出參數、引用參數或返回值

雙工模式

雙工模式建立在上面兩種模式的基礎之上,實現客戶端與服務端相互的調用。相互調用:以往我們只是在客戶端調用服務端,然後服務端有返回值返回客戶端,而相互調用不光是客戶端調用服務端,而且服務端也可以調用客戶端的方法。如下圖所示

在上圖中,客戶端的程序A調用服務端的程序A,服務程序A執行完成前又調用客戶端的程序D,然後再返回到程序A,圖有點亂,其實就是爲了說明“服務端”與“客戶端”可以相互調用,下面直接看代碼。

如我們所說的,雙工模式是建立在以上兩種模式之上的模式,他們並不衝突,代碼如下:

[ServiceContract(CallbackContract = typeof(IUserCallback))]
public interface IUser
{
     [OperationContract]
     string ShowName(string name);
}
​
//回調的接口 
public interface IUserCallback
{
     [OperationContract(IsOneWay = true)]
     void PrintSomething(string str);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章