程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF系列(二) 使用配置文件構建和使用WCF服務

WCF系列(二) 使用配置文件構建和使用WCF服務

編輯:關於.NET

當然,配置一個ServiceHost除了上面說的完全使用代碼的方式,更好的方式是使用配置文件,把一些可能需要修改的屬性跟代碼分離,放到配置文件中,這樣可以提供服務配置的靈活性,也更容易維護。

看看前面那個不用配置文件的WCF的例子改成使用配置文件會是怎樣配置的。

1、服務端

1.1.准備Contract和實現Contract的服務

這部分是功能接口和功能實現部分,不需要配置,所以這部分跟前面一樣。

[ServiceContract()]
public interface IService
{
   [OperationContract]
   string MyOperation1(string myValue);
}
public class Service : IService
{
   public string MyOperation1(string myValue)
   {
     return "Hello: " + myValue;
   }
}

1.2.建立ServiceHost

前面使用public ServiceHost(Type serviceType, params Uri[] baseAddresses)構造方法建立ServicesHost。

這裡建立ServiceHost實例也必須使用代碼,但是可以使用簡單些的構造方法:

ServiceHost myServiceHost = new ServiceHost(typeof(Service))

只要給ServiceHost指定你要運行服務的類型,就是告訴要駐留在ServiceHost裡的哪個WCF服務(實現某個或某些Contract的類)。BaseAddress部分這裡不需要指定了,可以放在配置文件裡。

編碼部分就這些,剩下的部分都只要通過配置文件進行設置即可。

1.3.WCF配置

WCF的配置使用.NET Framework的System.Configuration配置系統。在Visual Studio中配置一個WCF服務時,如果宿主是一般的windows應用或console應用,則配置文件為App.confing,,如果宿主是IIS應用,則配置文件為Web.config。

跟WCF相關的配置主要有三個元素:

<system.serviceModel>

<system.serviceModel.activation>

<system.runtime.serialization>

這三個元素都是.NET Framework配置文件的根元素<configuration>下的元素,其中<system.serviceModel>元素最為基本,WCF的基本設置集中在這個元素中。

看一下<system.serviceModel>元素的簡單結構:

<configuration>
  <system.serviceModel>
    <!-- services 元素包含應用中駐留的所有service的配置要求 -->
    <services>
    </services>
    <!-- 定義service和Endpiont行為-->
    <behaviors>
    </behaviors>
    <bindings>
    </bindings>
    <!-- 定義客戶端的配置-->
    <client>
    </client>
  </system.serviceModel>
</configuration>

1.4.建立跟ServiceHost相配的service配置

前面已經在代碼中建立了ServiceHost,並指定了這個ServiceHost中要駐留的服務類型。

在<services>標簽下加一個<service>標簽,注意,service的name屬性應該是ServiceHost中駐留那個服務的全限定名,即名稱空間加類名,表示這個service元素下的設置是針對這個服務的。

<services>
  <service name="WCFService.Service">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/WCFService/Service" />
      </baseAddresses>
    </host>
  </service>
</services>

在<service>元素下加<host>元素,這裡要增加的是baseAddress,跟使用代碼一樣,baseAddress可以有多個,用add標簽增加,但是同樣的通訊協議只能有一個baseAddress,比如http的只能有一個,https的只能有一個。

1.5.給service增加Endpoint

本例中WCF服務對外只有一個Endpoint,在<service>元素下增加<endpoint>元素,Endpoint的三個基本要素address、binding、contract都是<endpoint>元素屬性,當然它還有其他屬性,這裡先不提及,只描述完成這個簡單實例相關的設置。

address - 指定這個Endpoint對外的URI,這個URI可以是個絕對地址,也可以是個相對於baseAddress的相對地址。如果此屬性為空,則這個Endpoint的地址就是baseAddress。

binding - 指定這個Endpoint使用的binding,這個banding可以是系統預定義的9個binding之一,比如是basicHttpBinding,也可以是自定義的customBinding。binding決定了通訊的類型、安全、如何編碼、是否基於session、是否基於事務等等。

contract - 指定這個Endpoint對應的Contract的全限定名(名稱空間.類型名),這個Contract應該被service元素的name指定的那個service實現。

<services>
  <service behaviorConfiguration="NewBehavior" name="WCFService.Service">
    <endpoint address="" binding="basicHttpBinding" contract="WCFService.IService" />
  </service>
</services>

1.6.設置允許發布元數據

設置允許通過WSDL對外暴露對服務的Metadata。

是通過設置服務端行為的<serviceBehaviors>標簽下增加一個<behavior>,一個可以定義<behavior>一組服務端的行為設置,可以設置一個或多個系統提供的或定制的表示服務端行為的元素。

Name屬性,一個behavior唯一標識,<service>元素的behaviorConfiguration屬性指向這個name,即表示這個service使用這個behavior的配置。

<serviceMetadata>標簽,指定service元數據發布和相關信息。

httpGetEnabled 屬性是bool類型的值,表示是否允許通過HTTP的get方法獲取sevice的WSDL元數據。

httpGetUrl 屬性, 如果httpGetEnabled為true,這個屬性指示使用哪個URL地址發布服務的WSDL,如果這個屬性沒有設置,則使用服務的HTTP類型的baseAddress後面加上?WSDL。

<behaviors>
  <serviceBehaviors>
    <behavior name="NewBehavior">
      <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8001/" />
    </behavior>
  </serviceBehaviors>
</behaviors>

2、客戶端

2.1.引用service

客戶端要訪問服務端的服務,首先要知道服務端的服務提供了什麼方法,就是要知道服務的Contract。如何取得服務端的Contract有幾種方法,前一篇文章有講述,這裡不再贅述,這裡同樣采用最方便的在項目中添加Service reference來引用service。

在vs2005中安裝了WCF的extention後,在項目的References上點擊右鍵,會多出來一個“Add Service Reference”的選項,這就是用來引用WCF服務的,引用地址就是服務端設置的http的baseAddress。

在這裡引用WCF服務,跟使用Svcutil.exe命令一樣,會在項目中生成同樣的兩個文件。

2.2.生成客戶端service代理實例和配置文件

引用服務後,客戶端生成了配置文件和包含了Contract和本地代理類的cs文件。

引用WCF服務後,還會在同時給每個Contract不同的Endpoint生成一個繼承自System.ServiceModel.ClientBase的本地代理類。

客戶端可以直接使用多個重載的代理類構造方法實例化這些代理類。如果要使用配置文件,有這麼幾個構造方法可用:

1、public ServiceClient()

2、public ServiceClient(string endpointConfigurationName)

3、public ServiceClient(string endpointConfigurationName, string remoteAddress)

4、public ServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)

看一下,引用WCF後生成的配置文件中Client部分的內容,這部分包含客戶端跟服務端連接使用到的Endpoint的配置:

<client>
  <endpoint address="http://localhost:8080/WCFService/Service"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
    contract="WCFClient.localhost.IService" name="BasicHttpBinding_IService" />
</client>

實際上,客戶端代理類是從某個它對應的那個Contract繼承的,所以客戶端代理類本身一定是跟某個Contract相關的。

如果客戶端配置文件中這個代理類對應的Contract只有一個Endpoint配置,那麼可以使用第一個構造方法,運行時,會根據代理類的Contract在配置文件中相應的配置。

如果客戶端配置文件這個代理類對應的Contract有多個Endpoint配置,可以使用第二個構造方法,通過endpointConfigurationName參數指定使用哪一個Endpoint的配置。

對於本例,只有一個Contract,引用WCF服務後也只生成一個Endpoint配置,使用最簡單的構造方法即可:

localhost.ServiceClient proxy = new localhost.ServiceClient();
string result = proxy.MyOperation1("myFirstWCF");

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved