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