全面攻略WCF配置子節(jié)點(diǎn)
經(jīng)過長(zhǎng)時(shí)間學(xué)習(xí)WCF,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。如果熟悉WCF,你一定知道WCF配置是位于system.serviceModel節(jié)點(diǎn)下。你會(huì)看到3個(gè)子節(jié)點(diǎn):behaviors, serviceHostingEnvironment和serivces。
WCF配置子節(jié)點(diǎn)Services: 文件內(nèi)已經(jīng)有一個(gè)名為CatalogService的服務(wù),實(shí)現(xiàn)服務(wù)的類名一致。在Service節(jié)點(diǎn)下,你可以看到Endpoint,它包含了服務(wù)的 ABCs:Address(地址), binding (綁定)和contract (協(xié)定).
◆Address: 你會(huì)發(fā)現(xiàn)地址是空的 ,不必?fù)?dān)心,因?yàn)閟vc文件會(huì)作為基
◆Binding: webHttpBinding是WCF3.5提供的可以讓服務(wù)以REST方式發(fā)布的新型綁定。這個(gè)綁定有兩種模式,你可以通過特定的終結(jié)點(diǎn)行為來(lái)指定模式(通過設(shè)定behaviorConfiguration)
◆Contract: contract指定了WCF服務(wù)提供的功能。該屬性被設(shè)為一個(gè)已經(jīng)定義好的服務(wù)協(xié)定。要定義一個(gè)服務(wù)協(xié)定,你可以用ServiceContract修飾一個(gè)接口或者類。被ServiceContract修飾的接口或者類中,所有由OperationContract修飾的方法將被作為服務(wù)的操作暴露給客戶。一般來(lái)說(shuō)用接口做服務(wù)協(xié)定是更好的做法,這樣做的好處是分離了協(xié)定與具體實(shí)現(xiàn)。但在我們使用的模板中卻使用了類的方法,也就是說(shuō),接口是從類自動(dòng)推斷出來(lái)的(接口推斷)。
◆BehaviorConfiguration: 對(duì)于webHttpBinding, 你需要將該屬性設(shè)為一個(gè)擁有webHttp或enableWebScript子節(jié)點(diǎn)的終結(jié)點(diǎn)行為。
#T#F配置子節(jié)點(diǎn)Behaviors: 將behaviors加入到服務(wù)或者服務(wù)終結(jié)點(diǎn)的目的在于改變r(jià)untime的默認(rèn)行為或者加入定制的擴(kuò)展。你會(huì)發(fā)現(xiàn)我們使用的模板已經(jīng)聲明了一個(gè)名為 CatalogServiceAspNetAjaxBehavior的終結(jié)點(diǎn)行為. 該行為有一個(gè)enableWebScript 元素。enableWebScript是兩種可能的終結(jié)點(diǎn)行為之一,另一種就是webHttp。事實(shí)上enableWebScript是webHttp用來(lái)提供AJAX 功能(比如生成客戶端代理)的子類
WCF配置子節(jié)點(diǎn)ServiceHostingEnvironment: 跟ASP.Net運(yùn)行的WCF服務(wù)的默認(rèn)配置是讓兩者互不干擾 例如,ASP.NET runtime 不參與WCF請(qǐng)求的處理. WCF服務(wù)也不能使用ASP.NET context 和 session 這樣的功能. 而我們這里的配置是將aspNetCompatibilityEnabled 設(shè)為true, 在這種設(shè)置下WCF請(qǐng)求就會(huì)加到ASP.Net 的請(qǐng)求流水線里了。
*要使WCF支持REST,只要在該配置文件中注意最重要的兩點(diǎn):1)binding應(yīng)設(shè)為webHttpBinding 2) endpoint behavior要設(shè)定為webHttp或enableWebScript
- CatalogService.cs
- [ServiceContract(Namespace = "")]
- [AspNetCompatibilityRequirements(RequirementsMode =
- AspNetCompatibilityRequirementsMode.Allowed)]
- public class CatalogService
- {
- // Add [WebGet] attribute to use HTTP GET
- [OperationContract]
- public void DoWork()
- {
- // Add your operation implementation here
- return;
- }
- // Add more operations here and mark them with [OperationContract]
- }
在這里我們就真得做點(diǎn)兒事兒了。如果已經(jīng)讀了上面的內(nèi)容,你應(yīng)該已經(jīng)注意到我們已經(jīng)用接口推斷的方法定義了的服務(wù)協(xié)定,就是說(shuō)用ServiceContract屬性修飾了一個(gè)類而不是一個(gè)接口。無(wú)論如何,我們要開始做一點(diǎn)兒實(shí)現(xiàn)了。***件事兒是設(shè)定ServiceContract屬性的NameSpace參數(shù)。這一點(diǎn)非常重要。客戶端用于調(diào)用WCF服務(wù)的代理的名字空間就是從這里拿的。