日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WCF系列(二) -- 使用配置文件构建和使用WCF服务

發(fā)布時間:2024/9/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WCF系列(二) -- 使用配置文件构建和使用WCF服务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

1、服務(wù)端

1.1.??? 準(zhǔn)備Contract和實現(xiàn)Contract的服務(wù)

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

[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)構(gòu)造方法建立ServicesHost。

這里建立ServiceHost實例也必須使用代碼,但是可以使用簡單些的構(gòu)造方法:

ServiceHost myServiceHost = new ServiceHost(typeof(Service))

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

編碼部分就這些,剩下的部分都只要通過配置文件進(jìn)行設(shè)置即可。

1.3.??? WCF配置

WCF的配置使用.NET FrameworkSystem.Configuration配置系統(tǒng)。在Visual Studio中配置一個WCF服務(wù)時,如果宿主是一般的windows應(yīng)用或console應(yīng)用,則配置文件為App.confing,,如果宿主是IIS應(yīng)用,則配置文件為Web.config。

WCF相關(guān)的配置主要有三個元素:

<system.serviceModel>

<system.serviceModel.activation>

<system.runtime.serialization>

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

看一下<system.serviceModel>元素的簡單結(jié)構(gòu):

<configuration>

??? <system.serviceModel>

??????? <!-- services 元素包含應(yīng)用中駐留的所有service的配置要求 -->

??????? <services>

??????? </services>

??????? <!--定義serviceEndpiont行為-->

??????? <behaviors>

??????? </behaviors>

??????? <bindings>

??????? </bindings>

??????? <!--定義客戶端的配置-->

??????? <client>

??????? </client>

??? </system.serviceModel>

</configuration>

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

前面已經(jīng)在代碼中建立了ServiceHost,并指定了這個ServiceHost中要駐留的服務(wù)類型。

<services>標(biāo)簽下加一個<service>標(biāo)簽,注意,servicename屬性應(yīng)該是ServiceHost中駐留那個服務(wù)的全限定名,即名稱空間加類名,表示這個service元素下的設(shè)置是針對這個服務(wù)的。

<services>

??? <servicename="WCFService.Service">

??????? <host>

??????????? <baseAddresses>

??????????????? <addbaseAddress="http://localhost:8080/WCFService/Service" />

??????????? </baseAddresses>

??????? </host>

??? </service>

</services>

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

1.5.??? service增加Endpoint

本例中WCF服務(wù)對外只有一個Endpoint,在<service>元素下增加<endpoint>元素,Endpoint的三個基本要素addressbinding、contract都是<endpoint>元素屬性,當(dāng)然它還有其他屬性,這里先不提及,只描述完成這個簡單實例相關(guān)的設(shè)置。

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

binding - 指定這個Endpoint使用的binding,這個banding可以是系統(tǒng)預(yù)定義的9binding之一,比如是basicHttpBinding,也可以是自定義的customBindingbinding決定了通訊的類型、安全、如何編碼、是否基于session、是否基于事務(wù)等等。

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

<services>

??? <servicebehaviorConfiguration="NewBehavior"name="WCFService.Service">

??????? <endpointaddress=""binding="basicHttpBinding"contract="WCFService.IService" />

??? </service>

</services>

1.6.??? 設(shè)置允許發(fā)布元數(shù)據(jù)

設(shè)置允許通過WSDL對外暴露對服務(wù)的Metadata。

是通過設(shè)置服務(wù)端行為的<serviceBehaviors>標(biāo)簽下增加一個<behavior>,一個可以定義<behavior>一組服務(wù)端的行為設(shè)置,可以設(shè)置一個或多個系統(tǒng)提供的或定制的表示服務(wù)端行為的元素。

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

<serviceMetadata>標(biāo)簽,指定service元數(shù)據(jù)發(fā)布和相關(guān)信息。

httpGetEnabled 屬性是bool類型的值,表示是否允許通過HTTPget方法獲取seviceWSDL元數(shù)據(jù)。

httpGetUrl 屬性,如果httpGetEnabledtrue,這個屬性指示使用哪個URL地址發(fā)布服務(wù)的WSDL,如果這個屬性沒有設(shè)置,則使用服務(wù)的HTTP類型的baseAddress后面加上?WSDL

<behaviors>

??? <serviceBehaviors>

??????? <behaviorname="NewBehavior">

??????????? <serviceMetadatahttpGetEnabled="true"httpGetUrl="http://localhost:8001/" />

??????? </behavior>

??? </serviceBehaviors>

</behaviors>

2、客戶端

2.1.??? 引用service

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

vs2005中安裝了WCFextention后,在項目的References上點擊右鍵,會多出來一個“Add Service Reference”的選項,這就是用來引用WCF服務(wù)的,引用地址就是服務(wù)端設(shè)置的httpbaseAddress

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

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

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

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

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

1、public ServiceClient()

2public ServiceClient(string endpointConfigurationName)

3、public ServiceClient(string endpointConfigurationName, string remoteAddress)

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

看一下,引用WCF后生成的配置文件中Client部分的內(nèi)容,這部分包含客戶端跟服務(wù)端連接使用到的Endpoint的配置:

<client>

??? <endpointaddress="http://localhost:8080/WCFService/Service"

??????? binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_IService"

??????? contract="WCFClient.localhost.IService"name="BasicHttpBinding_IService" />

</client>

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

如果客戶端配置文件中這個代理類對應(yīng)的Contract只有一個Endpoint配置,那么可以使用第一個構(gòu)造方法,運行時,會根據(jù)代理類的Contract在配置文件中相應(yīng)的配置。

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

對于本例,只有一個Contract,引用WCF服務(wù)后也只生成一個Endpoint配置,使用最簡單的構(gòu)造方法即可:

localhost.ServiceClient proxy = new localhost.ServiceClient();

string result = proxy.MyOperation1("myFirstWCF");

使用配置文件的例子代碼下載:

http://files.cnblogs.com/chnking/ConfigWCF.rar

總結(jié)

以上是生活随笔為你收集整理的WCF系列(二) -- 使用配置文件构建和使用WCF服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。