問題:
使用WCF Service Configuration Editor工具生成XML文件來進行WCF的配置,而不是在CS文件中敲代碼。續上篇WCF入門的HelloWorld程序。
解決過程:
要取代上篇文章中HostApp.cs文件里的幾行配置代碼,使用工具配置步驟如下:(PS:如果對文件名有疑問,可以參看一個WCF入門的HelloWorld程序)
- 打開VS,在Host項目中右鍵,新建一個App.config文件。
- 點擊菜單欄Tools選項,在下拉菜單中選擇WCF Service Configuration Editor。
- 在彈出的工具窗口中選擇“File->open->Config File”。找到剛才建的App.config文件,並打開。
- 新建一個服務,如下圖所示,先點擊“創建新的服務”鏈接,再找到Service項目中的Services.Helloworld服務。

- 點擊下一步,找到Contracts項目中的IHello契約。

- 下一步,選擇Http的通信方式。

- 點擊下一步,選擇Basic Web Service Interoperability。(這 步忘截圖了,Sorry!)
- 點擊下一步,輸入服務端Endpoint地址,這個我們先不填,待會兒再配置host上填。(為什么這么做,待會在原理部分會有講到)。下一步Finish。
- 為服務添加行為(Behavior),這步很重要。在Advanced目錄下,右鍵新建一個Service行為,NewBehavior。在它上右鍵,添加服務元數據的擴展。然后對行為重命名為HelloWorldBehavior,並設置HttpGetEnabled為true。如下圖所示:


- 這些做好了之后,我們回到最上面的Service目錄,為HelloWorld服務添加剛才配的HelloWorldBehavior行為配置。如下圖所示:

- 接着配置Host的地址,選中Host,然后點擊右下方的New Base Address,輸入http://localhost:8080/HelloService

- 可以新添加一個服務端的Endpoint,用於配置WS-MetadataExchange,當然也可以不加。在Services目錄下的Endpoint右鍵,新建一個Endpoint,名字和地址隨意,保證Binding是mexHttpBinding。
- Ctrl+S保存,這樣App.config文件就自動寫滿了,如下:

原理:
這個,工具生成XML的原理,我還真講不出來,大標簽套小標簽的它都先做好了,你只要往里面填如參數就行。不過前面有個地址沒有填,有必要提一下。在上面的XML文件中你會發現有這么一段:
<endpoint address="" binding="basicHttpBinding" name="Hello" Contract="Contracts.IHello" listenUriMode="Explict"/> <host> <baseAddress> <add baseAddress="http://localhost:8080/HelloService"/> </baseAddress> </host>
endpiont的地址為空,只是配了Host的基地址。當然也可以直接配Endpoint的地址,不配Host的基地址。但如果host了多個服務呢?有多了Endpoint掛在同一個host下,那么配基地址就顯得很重要。從其他地方找的一個例子,代碼如下:
<service name="Wcf.Services.MallService" behaviorConfiguration="MallServiceBehaviors" > <endpoint address="" contract="Wcf.Contract.IUserService" binding="basicHttpBinding"></endpoint> <endpoint address="" contract="Wcf.Contract.IOrderService" binding="basicHttpBinding"></endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:8899/MallService%22/> </baseAddresses> </host> </service>
然后我想講的是,如何用這個生成的app.config文件替換原來HostApp中的代碼。
要做的改變如下:
- 將HostApp類里面的代碼改刪得都刪掉,如下。
HostApp
namespace Host { //用了xml文件,這個類就可以精簡很多,只需要這幾句就行 public class HostApp { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(HelloWorld)); host.Open(); Console.WriteLine("Start Your Service."); Console.ReadKey(); host.Close(); } } }
2.運行服務,並在瀏覽器地址欄中輸入http://localhost:8080/HelloService,出現如下效果,表示服務端OK了。

3.接下來就是Client端了。打開客戶端的項目(服務端不要關閉),選擇Client項目下的Service Reference,在你的服務命名空間上右鍵,點擊Update Service Reference。
會生成新的app.config文件。ClientApp的代碼沒變,點擊運行。
ClientApp
namespace Client { public class ClientApp { static void Main(String[] args) { ServiceEndpoint httpEndpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IHello)), new BasicHttpBinding(), new EndpointAddress("http://localhost:8080/HelloService")); using (ChannelFactory<IHello> factory = new ChannelFactory<IHello>(httpEndpoint)) { IHello service = factory.CreateChannel(); service.Hello(); } } } }

