可能大家會覺得我說完了wcf的介紹以后,會介紹wcf的契約、服務這些內容,但是我沒有,為什么呢?原因就是我一直堅持的從程序員中來,到程序員中去的觀點。程序員的學習是一個漸進的過程,不是有了介紹就可以直接了解wcf的全貌,但是我也沒有介紹wcf的配置,因為這個內容很多,但是我今天要介紹的是wcf中的一個知識點,這個知識點只是一個漸進的過程,但是知道了這個知識點以后,我們可以避免很多錯誤的發生。所以我說一下wcf中的一個Attribute ConfigurationName。
在很多的契約及其服務行為屬性中我們都可以看到這個屬性的存在,但是這個屬性究竟是做什么的。如果不仔細看一下很真是有些誤導,但是一旦明白了,心理就會大呼一口氣,那么簡單,會則不難的道理。呵呵。
廢話少說,因為configurationName的屬性在ServiceContract以及ServiceBehavior中都是一樣的。所以我就通過ServiceContract來說明一下。
還是上一次做的項目,我們在契約ServiceContract中添加ConfigurationName的值。有一點我們需要注意一下,如果我們不指定這個屬性的值,那么這個屬性的默認值就是這個接口或者類所在的命名空間全稱。不太好理解,上代碼
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.ServiceModel; 6 namespace Chinaer.WcfDemo.Contracts 7 { 8 [ServiceContract(Name = "ICal", Namespace = "http://www.chinaer.com",ConfigurationName="ICalInterface")] 9 public interface ICal 10 { 11 [OperationContract] 12 int Add(int x, int y); 13 14 int Sub(int x, int y); 15 } 16 }
大家請注意,我添加了ConfigurationName屬性的值為ICalInterface。因為原來的項目是可以運行的,那么如果我現在運行這個項目會出現什么樣的結果呢?我i啟動的是控制台宿主程序。
出現了異常,提示找不到協定名稱。但是我們仔細看一下,服務名稱為CalService,找不到協定名稱,這個異常讓我們摸不到頭腦。因為wcf的異常信息有時候確實令人懊惱。但是現在我們知道了目標,就是configurationName屬性的設定。這也是我們以后遇到此類異常信息可以查找的一個問題所在。現在我們來更改一下控制台宿主程序的配置文件。讓ConfigurationName的值設定在配置文件中。上代碼
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.serviceModel> 4 <services> 5 <service name="Chinaer.WcfDemo.Services.CalService" behaviorConfiguration="metaDataBehavior"> 6 <endpoint address="http://127.0.0.1:8888/calservice" binding="wsHttpBinding" contract="ICalInterface"></endpoint> 7 </service> 8 </services> 9 <behaviors> 10 <serviceBehaviors> 11 <behavior name="metaDataBehavior"> 12 <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/calservice/metadata"/> 13 </behavior> 14 </serviceBehaviors> 15 </behaviors> 16 <bindings> 17 </bindings> 18 </system.serviceModel> 19 </configuration>
配置文件沒有什么好說的,就是那個endpoint節點的contract的設定值,我們更改成了ICalInterface,就是剛才我們設定的ConfigurationName的值。在此運行控制台宿主程序,就會運行正常。
還有一個需要我們注意的地方就是,我們盡量不要手動輸入,因為wcf配置文件是大小寫敏感的,如果我們輸入錯誤,那么提示的異常信息和我們剛才的一樣。
上面都是說configurationName給我們帶來的不便,那肯定有好處了,要不微軟也不會添加這么一個屬性了。我個人認為這個屬性的添加可以讓我們從拼寫完整的命名空間全稱中解脫出來。舉個簡單的例子,如果我們不設定ConfigurationName的值,那么我們在endpoint節點的contract的值就應該為WcfDemo.Contracts.ICal.因為這個屬於字符串的輸入,沒有智能提示,所以我們輸入錯誤的風險很高,如果我們采用了ConfigurationName的話,那么我們要輸入的內容就會減少很多。這么說吧,凡是需要用到全名稱的地方,我們都可以用這個ConfigurationName的值來代替。
當然我在這里有個建議,就是在開始開發的時候盡量不要定義ConfigurationName的值,等到以后項目上線的時候再修改,因為定義了這個值的話,別人做模塊的話還需要告知他們,不如上線的時候統一一個文檔,統一更改來的舒服。當然這只是我的個人建議。
在ServiceBehavior中也有一個ConfigurationName的屬性值,和這個ServiceContract的屬性作用相同,我就不贅述了。
其實知道了ConfigurationName的作用以后,感覺就是那么的簡單。呵呵,加油各位