前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

作者头像
蒋金楠
发布于 2018-01-16 10:01:21
发布于 2018-01-16 10:01:21
7670
举报
文章被收录于专栏:大内老A大内老A

我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码和配置;通过ChannelFactory<TChannel>创建服务代理对象。在这篇文章中,我们采用一种独特的方式进行服务的调用。从本质上讲,我们只要能够创建于服务端相匹配的终结点,就能够实现正常的服务调用。在WCF客户端元数据架构体系中,利用MetadataExchangeClient可以获取服务的元数据,而利用MetadataImporter将获取的元数据导入成ServiceEndpoint对象。在本例中,我们将利用这两个组件定义了一个独特的服务调用的简单的例子,相信可以帮助读者进一步加深对WCF元数据框架体系的理解。 (Source从这里下载)

我们依然采用我们熟悉的计算服务的例子,下面是该服务相应的服务契约、服务类型的定义和寄宿该服务采用的配置。

代码语言:js
AI代码解释
复制
   1: using System.ServiceModel;
   2: namespace Artech.ServiceInvocationViaMetadata.Contracts
   3: {
   4:     [ServiceContract(Namespace = "http://www.artech.com/")]
   5:     public interface ICalculator
   6:     {
   7:         [OperationContract]
   8:         double Add(double x, double y);
   9:     }
  10: }

服务类型:

代码语言:js
AI代码解释
复制
   1: using System.ServiceModel;
   2: using Artech.ServiceInvocationViaMetadata.Contracts;
   3:  
   4: namespace Artech.ServiceInvocationViaMetadata.Services
   5: {
   6:     public class CalculatorService : ICalculator
   7:     {
   8:         public double Add(double x, double y)
   9:         {
  10:             return x + y;
  11:         }
  12:     }
  13: }

配置:

代码语言:js
AI代码解释
复制
   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <system.serviceModel>
   4:         <behaviors>
   5:             <serviceBehaviors>
   6:                 <behavior name="mexBehavior">
   7:                     <serviceMetadata />
   8:                 </behavior>
   9:             </serviceBehaviors>
  10:         </behaviors>
  11:         <services>
  12:             <service behaviorConfiguration="mexBehavior" name="Artech.ServiceInvocationViaMetadata.Services.CalculatorService">
  13:                 <endpoint address="http://127.0.0.1:3721/calculatorservice" binding="ws2007HttpBinding" contract="Artech.ServiceInvocationViaMetadata.Contracts.ICalculator" />
  14:                 <endpoint address="http://127.0.0.1:3721/calculatorservice/mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  15:             </service>
  16:         </services>
  17:     </system.serviceModel>
  18: </configuration>

从上面的配置我们可以看到,服务的元数据通过WS-MEX模式发布出来,发布的地址和采用的MEX绑定分别为:http://127.0.0.1:3721/calculatorservice/mex和mexHttpBinding。

接下来,我们就可以通过下面的方式对该服务进行调用了。我们先创建MetadataExchangeClient对象并利用它获取包含元数据的MetadataSet对象,并利用该对象创建WsdlImporter对象。接下来,我们将基于ICalculator接口的服务契约添加到该WsdlImporter的已知契约列表中,调用ImportAllEndpoints方法得到导入的ServiceEndpoint列表。最后根据导出的ServiceEndpoint对象创建ChannelFactory<ICalculator>对象,并创建服务代理进行服务调用。

代码语言:js
AI代码解释
复制
   1: sing System;
   2: using System.ServiceModel;
   3: using System.ServiceModel.Description;
   4: using System.Xml;
   5: using Artech.ServiceInvocationViaMetadata.Contracts;
   6: namespace Artech.ServiceInvocationViaMetadata.Client
   7: {
   8:     class Program
   9:     {
  10:         static void Main(string[] args)
  11:         {
  12:             MetadataExchangeClient metadataExchangeClient = new MetadataExchangeClient(MetadataExchangeBindings.CreateMexHttpBinding());
  13:             MetadataSet metadata = metadataExchangeClient.GetMetadata(new EndpointAddress("http://127.0.0.1:3721/calculatorservice/mex"));
  14:             WsdlImporter wsdlImporter = new WsdlImporter(metadata);
  15:             //添加已知契约类型
  16:             ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
  17:             wsdlImporter.KnownContracts.Add(new XmlQualifiedName(contract.Name, contract.Namespace), contract);
  18:             ServiceEndpointCollection endpoints = wsdlImporter.ImportAllEndpoints();
  19:             using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(endpoints[0]))
  20:             {
  21:                 ICalculator calculator = channelFactory.CreateChannel();
  22:                 using (calculator as IDisposable)
  23:                 {
  24:                     try
  25:                     {
  26:                         Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, calculator.Add(1, 2));
  27:                     }
  28:                     catch(TimeoutException)
  29:                     {
  30:                         (calculator as ICommunicationObject).Abort();
  31:                         throw;
  32:                     }
  33:                     catch(CommunicationException)
  34:                     {
  35:                         (calculator as ICommunicationObject).Abort();
  36:                         throw;
  37:                     }
  38:                 }
  39:             }
  40:             Console.Read();
  41:         }
  42:     }
  43: }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-MEX和HTTP-GET的元数据发布,针对这两种不同的协议,元数据获取的实现方式也是不同的。我们首先来实现基于WS-MEX的元数据获取方式。 [Source Code从这里下载] 一、 基于WS-MEX的元数据获取 ServiceMetadataBehavior通过创建MEX终结点实现了基于WS-MEX的元数据的发布,从《如何将一个服务发布成WSDL》系列文章的介绍我们知道:元数
蒋金楠
2018/01/16
5820
WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]
对于WCF服务端元数据架构体系来说,通过MetadataExporter将服务的终结点导出成MetadataSet(参考《如何导出WCF服务的元数据》),仅仅是完成了一半的工作。被成功导出的以MetadataSet对象表示的元数据需要最终作为可被访问的网络资源发布出来,才能被服务消费者获取,进而有效地帮助他们进行服务调用。元数据的发布最终是通过ServiceMetadataBehavior这样一个服务行为实现的,我们先来认识一下ServiceMetadataBehavior。 一、 元数据发布的实现者:S
蒋金楠
2018/01/16
7810
WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
通过《如何将一个服务发布成WSDL[编程篇]》的介绍我们知道了如何可以通过编程或者配置的方式将ServiceMetadataBehavior这样一个服务形式应用到相应的服务上面,从而实现基于HTTP-GET或者WS-MEX的元数据发布机制。那么在WCF内部具体的实现原理又是怎样的呢?相信很多人对此都心存好奇,本篇文章的内容将围绕着这个主题展开。 一、 从WCF分发体系谈起 如果读者想对WCF内部的元数据发布机制的实现原理有一个全面而深入的了解,必须对WCF服务端的分发体系有一个清晰的认识。在这里我们先对
蒋金楠
2018/01/16
7870
WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂。同时,WCF设计的一个目的就是提供基于非业务逻辑的通信实现,为编程人员提供一套简单易用的应用编程接口(API)。WCF编程模式的简单性同样体现在异常处理上面,本篇文章的主要目的就是对WCF基于异常处理的编程模式做一个简单的介绍。 一、当异常从服务端抛出 对于一个典型的WCF服务调用,我个人倾向于将潜在抛出的异常费为两种类型:应用异常(Application Exception)和基础结构(Infr
蒋金楠
2018/01/16
8080
WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端;如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送。 这两种方式体现了两种极
蒋金楠
2018/01/16
1.3K0
WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
[WCF-Discovery] 实例演示:如何利用服务发现机制实现服务的“动态”调用?
前面两篇(《服务如何能被”发现”》和《客户端如何能够“探测”到可用的服务?》)我们分别介绍了可被发现服务如何被发布,以及客户端如果探测可用的服务。接下来我们通过一个简单的例子来演示如果创建和发布一个可被发现的服务,客户端如何在不知道服务终结点地址的情况下动态探测可用的服务并调用之。该实例的解决方案采用如右图所示的结构,即包含项目Service.Interface(类库)、Client(控制台应用)和Service(控制台应用)分别定义服务契约、服务(包括服务寄宿)和客户端程序。[源代码从这里下载,Dyn
蒋金楠
2018/02/07
6510
[WCF-Discovery] 实例演示:如何利用服务发现机制实现服务的“动态”调用?
WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
在前面一片文章(服务代理不能得到及时关闭会有什么后果?)中,我们谈到及时关闭服务代理(Service Proxy)在一个高并发环境下的重要意义,并阐明了其根本原因。但是,是否直接调用ICommunic
蒋金楠
2018/01/16
2K0
WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
[原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
在上面一篇文章中,我们对不同版本的IIS,以及ASP.NET得的实现机制进行了详细而深入的分析。在介绍IIS7.0的时候,我们谈到,HTTP.SYS+W3SVC实现了基于HTTP的请求监听,在此基础上引入了以下三组网络监听器(Listener)和监听适配器(Adapter),实现了基于TCP、Named Pipes和MSMQ的网络监听,图1揭示了IIS7的总体结构。 TCPListener|TCP Listener Adapter NamedPipes Listener|Named Pipes Liste
蒋金楠
2018/01/16
7260
[原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
我的WCF之旅(1):创建一个简单的WCF程序
为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构。对那些对WCF不是很了解的读者来说,这个例子将带领你正式进入WCF的世界。 在这个例子中,我们将实现一个简单的计算服务(CalculatorService),提供基本的加、减、乘、除的运算。和传统的分布式通信框架一样,WCF本质上提供一个跨进程、跨机器以致跨网络的服务调用。在本例中,客户端和服务通过运行在相同的同一台机器上不同进程模拟,图1体现了客户端
蒋金楠
2018/02/07
9280
我的WCF之旅(1):创建一个简单的WCF程序
WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源。同理,一个WCF服务的监听与执行同样需要通过一个进程来承载。我们将为WCF服务创建或指定一个进程的方式称为服务寄宿(Service Hosting)。服务寄宿的本质通过某种方式,创建或者指定一个进程用以监听服务的请求和执行服务操作,为服务提供一个运行环境。 服务寄宿的方式大体分两种:一种是为一组WCF服务创建一个托管的应用程序,通过手工启动程序的方式对服务进行寄宿,所有的托管的应用程序均可作为WCF服务的宿主,比如C
蒋金楠
2018/01/16
1K0
Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[上]
在《WCF技术剖析(卷1)》的最后一章,我给出了一个具体的应用WCF的分布式应用实例,我把这个实例命名为PetShop。在这个例子中,我利用WCF的扩展实现了一些设计、架构模式,比如AOP、IoC等。看过本书的读者,一定还记得我还通过WCF扩展实现了于微软企业库(Enterprise Library)异常处理应用块(Exception Handling Application Block:EHAB)的集成。当时由于缺乏相应的背景知识,不可能介绍具体的实现,现在我们可以详细来讲述这是如何实现的。 (Sourc
蒋金楠
2018/01/16
5480
Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[上]
Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[下]
在上篇中,我详细介绍了如何通过自定义ClientMessageInspector和ErrorHandler,实现WCF与微软企业库中的Exception Handling Application Block(EHAB)之间的集成。这个方案的基本思路就是:当异常从服务端抛出,利用EHAB针对某个配置好的异常处理策略进行处理;然后将处理有的异常通过ServiceExceptionDetail对象进行封装,最后序列化置于Fault消息,最终被返回给客户端;客户端接收到该Fault消息后,提取并创建ServiceE
蒋金楠
2018/01/16
5040
[WCF权限控制]基于Windows用户组的授权方式[下篇]
为了让读者对基于Windows用户组的授权具有深刻的认识,接下来我们通过一个简单的事例来讲解在真正的应用中该授权模式如何使用。对于接下来演示的事例,我们将采用Windows认证和授权。至于授权的最终实现,我们采用的是在服务方法上面应用PrincipalPermissionAttribute特性方式的声明式授权。[源代码从这里下载] 目录: 步骤一、创建测试帐号 步骤二、创建服务契约和服务 步骤三、寄宿服务 步骤四、创建客户端程序 步骤一、创建测试帐号 在创
蒋金楠
2018/01/16
9630
[WCF权限控制]基于Windows用户组的授权方式[下篇]
[WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]
在《原理篇》中我们谈到:如果采用自定义安全主体权限模式,我们可以通过自定义AuthorizationPolicy或者ServiceAuthorizationManager实现对基于当前认证用于相关的安全主体的提供,进而达到授权的目的。为了让大家对此有个更加深刻的认识,在这篇文章中我们会提供一个具体的例子。[源代码从这里下载] 目录: 一、创建自定义AuthorizationPolicy 二、创建自定义ServiceAuthorizationManager 三、通过自
蒋金楠
2018/02/07
8020
[WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]
WCF的安全审核——记录谁在敲打你的门
WCF所谓的安全审核就是针对认证和授权所做的针对EventLog的日志记录。我们不但可以设置进行审核的事件(认证成功/失败,授权成功或失败),还可以选择记录信息被写入的EventLog类型,即应用程序日志(Application)还是安全日志(Security)。WCF的安全审核是通过ServiceSecurityAuditBehavior服务行为实现的。 一、ServiceSecurityAuditBehavior服务行为 针对WCF安全审核的编程只涉及ServiceSecurityAuditBehavi
蒋金楠
2018/02/07
8130
WCF的安全审核——记录谁在敲打你的门
[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[SSL over TCP]
在接下来的系列文章中我们正是讨论关于身份认证的主题。在前面我们已经谈到了,WCF中的认证属于“双向认证”,既包括服务对客户端的认证(以下简称客户端认证),也包括客户端对服务的认证(以下简称服务认证)。客户端认证和服务认证从本质上并没有什么不同,无非都是被认证一方提供相应的用户凭证供对方对自己的身份进行验证。我们先来讨论服务认证,客户端认证放在后续的文章中。 在《从两种安全模式谈起》中,我们对TLS/SSL进行了简单的介绍。我们知道,客户端和服务在为建立安全上下文而进行的协商过程中会验证服务端的X.509证书
蒋金楠
2018/02/07
1.5K0
[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[SSL over TCP]
WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
在这之前,我写过深入介绍MS EnterLib PIAB的文章(参阅《MS Enterprise Library Policy Injection Application Block 深入解析[总结篇]》),也写过WCF与PIAB的集成(参阅:《WCF后续之旅(8):通过WCF Extension 实现与MS Enterprise Library Policy Injection Application Block 的集成》)、WCF与Unity的集成(参阅《WCF后续之旅(7):通过WCF Extension实现和Enterprise Library Unity Container的集成》)以及Unity与PIAB的集成(参阅《Enterprise Library深入解析与灵活应用(1):通过Unity Extension实现和Policy Injection Application Block的集成》、《Enterprise Library深入解析与灵活应用(7):再谈PIAB与Unity之间的集成》)。由于部分实现时基于EnterLib、Unity前一个版本,在新的版本中(EnterLib V4.1与Unity 1.2)中,MS通过Unity对PIAB进行了重新设计与实现,所以我们很有必要重拾着这个话题,谈谈对于新的EnterLib和Unity,如何将PIAB和Unity集成到WCF之中。(Source Code从这里下载)
蒋金楠
2022/05/09
6210
WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
我的WCF之旅(8):WCF中的Session和Instancing Management
我们知道,WCF是MS基于SOA建立的一套在分布式环境中各个相对独立的Application进行Communication的构架。他实现了最新的基于WS-*规范。按照SOA的原则,相对独自的业务逻辑以service的形式封装,调用者通过Messaging的方式调用Service。对于承载着某个业务功能的实现的Service应该具有Context无关性、甚至是Solution无关性,也就是说个构成Service的operation不应该绑定到具体的调用上下文,对于任何调用,具有什么样的输入,就会有与之对应的输出。因为SOA的一个最大的目标就是尽可能地实现重用,只有具有Context无关性/Solution无关性,Service才能实现最大限度的重用。此外Service的Context无关性/Solution无关性还促进了另一个重要的面向服务的特征的实现:可组合性,把若干相关细粒度的Service封装成一个整体业务流程的Service。
蒋金楠
2022/05/09
2730
我的WCF之旅(8):WCF中的Session和Instancing Management
[WCF权限控制]WCF自定义授权体系详解[实例篇]
在《原理篇》中,我们谈到WCF自定义授权体系具有两个核心的组件:AuthorizationPolicy和ServiceAuthorizationManager,已经它们是如何写作最终提供一种基于声明的授权实现。为了让自定义授权有深刻的理解,我们来进行一个简单实例来演示如何通过自定义这两个组件实现“非角色授权策略”。[源代码从这里下载] 目录: 一、创建演示程序解决方案 二、自定义AuthorizationPolicy 三、自定义ServiceAuthorizatio
蒋金楠
2018/01/16
9370
[WCF权限控制]WCF自定义授权体系详解[实例篇]
[WCF安全系列]服务凭证(Service Credential)与服务身份(Service Identity)
在采用TLS/SSL实现Transport安全的情况下,客户端对服务证书实施认证。但是在默认情况下,这种认证仅仅是确保服务证书的合法性(通过数字签名确保证书确实是由申明的CA颁发)和可信任性(证书或者CA证书存储于相应的可信赖存储区)。而WCF提供服务证书并不限于此,客户端对服务认证的模式应该是这样的:服务端预先知道了服务的身份,在进行服务调用之前,服务端需要提供相应的凭证用以辅助客户端确认调用的服务具有预先确定的身份。对于这样的服务认证模式,具有两个重要的概念,即服务凭证和服务身份。 目录:
蒋金楠
2018/02/07
1.2K0
推荐阅读
WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
5820
WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]
7810
WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
7870
WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
8080
WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
1.3K0
[WCF-Discovery] 实例演示:如何利用服务发现机制实现服务的“动态”调用?
6510
WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
2K0
[原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
7260
我的WCF之旅(1):创建一个简单的WCF程序
9280
WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
1K0
Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[上]
5480
Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[下]
5040
[WCF权限控制]基于Windows用户组的授权方式[下篇]
9630
[WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]
8020
WCF的安全审核——记录谁在敲打你的门
8130
[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[SSL over TCP]
1.5K0
WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
6210
我的WCF之旅(8):WCF中的Session和Instancing Management
2730
[WCF权限控制]WCF自定义授权体系详解[实例篇]
9370
[WCF安全系列]服务凭证(Service Credential)与服务身份(Service Identity)
1.2K0
相关推荐
WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文