WCF还是比较常用的,于是我研究了一下WCF契约查询,在这里拿出来和大家分享一下,希望对大家有用。当我们拿到一个服务地址的时候该如何知道这个服务所提供的服务呢?如果是您自己开发的Service,这一点或许不需要兴师动众,但是如果是别人开发的服务,那么了解服务中的Endpoint将显得格外重要,本文将利用对[WCF]继承中所构建的服务代码进行分析。
熟悉Web Service开发的程序员对添加服务引用应该并不陌生。在创建某个服务的客户端程序时,并不需要从头开始编写客户端的底层通信和交互代码,可以通过输入服务地址来添加服务来让Visual Studio生成客户端代理,这样访问服务就像访问本地组件一样,而不需要去关心通信的细节。如果创建的客户端程序项目和服务程序项目处在同一个解决方案里(很多开发者在开发服务时,也会同步开发客户端程序),还可以通过Visual Studio来帮助我们“发现(Discovery)”服务,并添加服务引用。
打开其程序代码添加一个WCF契约查询ConsoleApplication应用程序,新建程序,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,因为我们只需分析那个“地址”所提供给我们的究竟是什么样的服务,而不是要去使用服务中的WCF契约查询