問題起源:web
不少時候爲了業務層調用(後臺代碼),一些公共服務就獨立成了WCF,使用起來很是方便,添加服務引用,而後簡單配置就能夠調用了。spa
若是這個時候Web站點頁面須要調用怎麼辦呢? 複雜的XML , 使用不方便 ,並且通訊成本也比較高。 這時候有人受不了了,code
因而就新建了一套WebAPI , Web頁面調用爽了。可是維護起來又麻煩了,一下子WCF , 一下子WebAPI 一段時間事後,能夠想象已經相差甚遠了。orm
某一天同事A , 在業務層須要調用一個接口 ,發現它是WebAPI方式的 ,被迫沒辦法 , 去寫了一個DoRequest(..)的方法來封裝調用WebAPI ,blog
感受比較痛苦,無故端增長了程序複雜度和工做量,同時還增長程序的風險點。接口
問題分析:ip
其實就是WCF不能兼容WebAPI輸出Json格式數據 , 若是能夠寫一套接口就搞定了。get
有沒有一個辦法能讓WCF服務又能夠在業務層添加服務的方式調用,又能夠在網頁上經過jQuery調用返回簡潔的Json數據呢?string
如何解決:it
WCF可使用多個Endpoint,能不能再這個上面作文章呢?
首先,讓你的WCF接口支持Web請求,返回Json ,
System.ServiceModel.Web , 下有一個WebGetAttribute 能夠幫咱們實現:
[OperationContract] [WebGet(UriTemplate = "/yyy/{id}", ResponseFormat = WebMessageFormat.Json)] Product[] yyy(string id);
而後,修改服務配置:
<system.serviceModel> <services> <service name="xxx" behaviorConfiguration="Default"> <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="basicTransport" contract="Ixxx"/>/*提供WebGet服務用*/ <endpoint address="Wcf" binding="basicHttpBinding" contract="Ixxx"/>/*提供WCF服務 , 注意address='Wcf',爲了區分開與WebGet的地址,添加引用以後會自動加上的*/ <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>/*元數據endpoint*/ </service> </services> <behaviors> <serviceBehaviors> <behavior name="Default"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> <behavior name=""> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="web"> <webHttp helpEnabled="true"/> </behavior> </endpointBehaviors> </behaviors> <bindings> <webHttpBinding> <binding name="basicTransport"/> </webHttpBinding> </bindings> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel>
Web調用地址:http://ip:port/xxx.svc/yyy/id
Wcf服務地址會變爲:http://ip:port/xxx.svc/Wcf
如此一來,前臺後臺的使用方式都不變,今後WCF一箭雙鵰,少了重複造輪子的時間與煩惱,省心很多。