演示W(wǎng)CF契約查詢ConsoleApplication應(yīng)用實例
WCF還是比較常用的,于是我研究了一下WCF契約查詢,在這里拿出來和大家分享一下,希望對大家有用。當我們拿到一個服務(wù)地址的時候該如何知道這個服務(wù)所提供的服務(wù)呢?如果是您自己開發(fā)的Service,這一點或許不需要興師動眾,但是如果是別人開發(fā)的服務(wù),那么了解服務(wù)中的Endpoint將顯得格外重要,本文將利用對[WCF]繼承中所構(gòu)建的服務(wù)代碼進行分析。
熟悉Web Service開發(fā)的程序員對添加服務(wù)引用應(yīng)該并不陌生。在創(chuàng)建某個服務(wù)的客戶端程序時,并不需要從頭開始編寫客戶端的底層通信和交互代碼,可以通過輸入服務(wù)地址來添加服務(wù)來讓Visual Studio生成客戶端代理,這樣訪問服務(wù)就像訪問本地組件一樣,而不需要去關(guān)心通信的細節(jié)。如果創(chuàng)建的客戶端程序項目和服務(wù)程序項目處在同一個解決方案里(很多開發(fā)者在開發(fā)服務(wù)時,也會同步開發(fā)客戶端程序),還可以通過Visual Studio來幫助我們“發(fā)現(xiàn)(Discovery)”服務(wù),并添加服務(wù)引用。
打開其程序代碼添加一個WCF契約查詢ConsoleApplication應(yīng)用程序,新建程序,WCF契約查詢代碼如下:
- using System;
- using System.ServiceModel.Description;
- namespace ContractQueriesClient
- {
- class Program
- {
- static void Main(string[] args)
- {
- // ?WSDL
- //string mexAddress = "http://localhost:8080/ScientificCalculatorService?WSDL";
- //MetadataExchangeClient MEXClient = new MetadataExchangeClient(new Uri(mexAddress), MetadataExchangeClientMode.HttpGet);
- // /MEX string mexAddress = "http://localhost:8080/ScientificCalculatorService/mex";
- MetadataExchangeClient MEXClient = new MetadataExchangeClient(new Uri(mexAddress), MetadataExchangeClientMode.MetadataExchange);
- MetadataSet metadata = MEXClient.GetMetadata();
- MetadataImporter importer = new WsdlImporter(metadata);
- ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();
- int endpointCounter = 0;
- foreach (ServiceEndpoint endpoint in endpoints)
- { Console.WriteLine("endpoints[{0}].Name = {1}", endpointCounter, endpoint.Name);
- Console.WriteLine("endpoints[{0}].Contract.Namespace = {1}", endpointCounter, endpoint.Contract.Namespace);
- Console.WriteLine("endpoints[{0}].Contract.Name = {1}", endpointCounter, endpoint.Contract.Name); endpointCounter++; }
System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();- int contractCounter = 0; foreach (ContractDescription contract in contracts)
- { Console.WriteLine("contracts[{0}].Namespace = {1}", contractCounter, contract.Namespace);
- Console.WriteLine("contracts[{0}].Name = {1}", contractCounter, contract.Name); contractCounter++; } } } }
這個項目我們不需要Add ServiceReference,因為我們只需分析那個“地址”所提供給我們的究竟是什么樣的服務(wù),而不是要去使用服務(wù)中的WCF契約查詢