为什么我的angularjs 自定义元素WCF行为扩展元素类型被发现

关于WCF的一个非常“无语”的BUG!
这确实是一个让人觉得“无语”的BUG,甚至让我觉得微软在故意和我们开玩笑。这个问题在我刚刚接触WCF的时候就遇到过,换言之,这个问题一直存在于.NET 3.0、3.5和现在的4.0。这是一个关于在你对WCF进行扩展的时候会经常碰到的问题,读者朋友们可以根据下面的步骤来再现这一个问题。
创建自定义行为(服务行为、终结点行为、契约行为和操作行为)是对WCF进行扩展最为常用的形式。通过下面的代码,我们创建了一个自定义的服务行为,为了简单我们没有编写任何逻辑代码。
1: namespace Artech.Bug4BehaviorExtension
public class FooBehavior : IServiceBehavior
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection&ServiceEndpoint& endpoints, BindingParameterCollection bindingParameters) { }
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
自定义服务行为可以通过两种方式应用到WCF运行时框架中:自定义特性(Attribute)和配置。现在我们采用后面一种,为此我们需要为上面创建的FooBehavior创建相应的BehaviorExtensionElement(本质上是一个):FooBehaviorElement。
1: namespace Artech.Bug4BehaviorExtension
public class FooBehaviorElement : BehaviorExtensionElement
public override Type BehaviorType
get { return typeof(FooBehavior); }
protected override object CreateBehavior()
return new FooBehavior();
接下来,我们创建一个简单的WCF服务来使用上面的服务行为,下面是服务和服务契约的定义。
1: namespace Artech.Bug4BehaviorExtension
[ServiceContract(Namespace=&http://www.artech.com/&)]
public interface ICalculator
[OperationContract]
double Add(double x, double y);
public class CalculatorService : ICalculator
public double Add(double x, double y)
return x +
我采用IIS寄宿(Host)的方式来寄宿CalculatorService服务,为此我们创建一个.svc文件。该文件的内容如下:
1: &%@ ServiceHost Service=&Artech.Bug4BehaviorExtension.CalculatorService&%&
通过如下的配置,上面定义的FooBehavior被应用到了CalculatorService服务上面。行为扩展的类型为:“Artech.Bug4BehaviorExtension.FooBehaviorElement, Artech.Bug4BehaviorExtension”(注意这是关键)。
1: &?xml version=&1.0& encoding=&utf-8& ?&
2: &configuration&
&system.serviceModel&
&behaviors&
&serviceBehaviors&
&behavior name=&myServiceBehavior&&
&serviceMetadata httpGetEnabled=&true&/&
&/behavior&
&/serviceBehaviors&
&/behaviors&
&extensions&
&behaviorExtensions&
&add name=&foo& type=&Artech.Bug4BehaviorExtension.FooBehaviorElement, Artech.Bug4BehaviorExtension& /&
&/behaviorExtensions&
&/extensions&
&services&
&service behaviorConfiguration=&myServiceBehavior& name=&Artech.Bug4BehaviorExtension.CalculatorService&&
&endpoint binding=&ws2007HttpBinding& contract=&Artech.Bug4BehaviorExtension.ICalculator& /&
&baseAddresses&
&add baseAddress=&http://127.0.0.1:3721/calculatorservice& /&
&/baseAddresses&
&/service&
&/services&
&/system.serviceModel&
28: &/configuration&
现在我们通过IE直接访问服务的地址,你会看到如下的界面——这基本上可以表面我们的服务被成功发布。
现在我们做一个非常微小的改变,将扩展行为类型从&Artech.Bug4BehaviorExtension.FooBehaviorElement, Artech.Bug4BehaviorExtension” 改成“Artech.Bug4BehaviorExtension.FooBehaviorElement,Artech.Bug4BehaviorExtension”。可能你都没有注意到到底我做了怎样的改动,提醒你一下:我们将类型名称和程序基名称之间的空格去掉了。
1: &?xml version=&1.0& encoding=&utf-8& ?&
2: &configuration&
&system.serviceModel&
&behaviors&
&serviceBehaviors&
&behavior name=&myServiceBehavior&&
&serviceMetadata httpGetEnabled=&true&/&
&/behavior&
&/serviceBehaviors&
&/behaviors&
&extensions&
&behaviorExtensions&
&add name=&foo& type=&Artech.Bug4BehaviorExtension.FooBehaviorElement,Artech.Bug4BehaviorExtension& /&
&/behaviorExtensions&
&/extensions&
&services&
&service behaviorConfiguration=&myServiceBehavior& name=&Artech.Bug4BehaviorExtension.CalculatorService&&
&endpoint binding=&ws2007HttpBinding& contract=&Artech.Bug4BehaviorExtension.ICalculator& /&
&baseAddresses&
&add baseAddress=&http://127.0.0.1:3721/calculatorservice& /&
&/baseAddresses&
&/service&
&/services&
&/system.serviceModel&
28: &/configuration&
现在再次刷新IE页面,你将会得到如下的结果。页面上的错误信息表明:我们定义的行为扩展类型无法被WCF解析——仅仅删除了一个小小的空格,WCF就不能正确地解析类型,这彻底让我无语。在本章的开篇我已经说过,这个问题我在很多年前就遇到过。因为我习惯于手工进行WCF的配置,在进行WCF扩展相关配置的时候,我经常发现我的服务访问不了,但是怎么也找不到问题的症结。然后通过VS提供的配置工具去配置,发现服务可以正常访问。然后两者进行对比,也没有发现有什么差异。其实在那种情况下,即使我发现多一个空格这种差异,我也不会觉得这种差别就是问题的症结所在。隐约记得有位读者在我的Blog上有过相关的留言,当时也没有在意,所以这个问题就一直没有深究。我想肯定会有人之前就发现过这个问题,肯定还会有后继者会遇到这个问题。为此,写下了这篇没有什么技术含量的博文,希望遇到相似问题但百思不得其解的人能够发现这篇文章。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文链接:← 上一篇:
构建wcf面向服务的应用程序系列课程(共15讲)
前沿视频教程信息
教程主题:构建WCF面向服务的应用程序系列课程
教程讲数:15讲
讲课老师:付仲恺&&
前沿视频教程目录
第01讲:WCF概要
课程简介:Windows Communication Foundation (WCF)是微软公司为构建面向服务的应用程序(SOA)所提供的消息平台。该平台随着Windows Vista操作系统,并且作为.NET Framework 3.0的一部分发布。WCF统一了组件与服务之间如何通讯的开发模型:无论是否是分布式架构,是否需要穿越防火墙访问,或者对于互操作接口的可用性,WCF都提供了统一的开发模型。在本次课程中,我们将向大家介绍WCF是如何从.NET Remoting,Enterprise Services,ASP.NET Web Services(ASMX)以及Web Services Enhancements(WSE)演化而来,并最终封装为单一的技术。同时,我们将向大家介绍WCF如何作为面向服务架构的技术,讨论其编程模型,以及对于WCF的开发代码进行概要介绍以为后继课程进行铺垫。&
第02讲:WCF契约设计
课程简介:客户端与服务器端通过交换序列化后的消息进行通讯,并且在各自的端点处将消息反序列化为公共语言运行时类型。在最简单的场景中,客户端与服务器端的开发者只通过对象来相互操作,并且所有的序列化操作都被隐藏起来执行。WCF提供了这个隐藏的操作。Web Services描述语言(WSDL)描述了到达服务器端所需要的协议,客户端使用代理来与服务器端进行通讯,并且处理消息。当开发者需要更加细致地控制服务契约设计,消息序列化以及协议的选择时,也可以通过WCF来帮助我们完成。在本次的课程中,我们将向大家介绍设计服务契约,数据契约和消息契约的实用指导,向大家展示什么时候,以及如何使用它们。同时,在本次课程中您将学习到如何处理复杂类型的序列化,如何使用契约,以及在哪里处理消息契约是最佳的位置。另外,我们还将向大家介绍如何对于已知的类型实现多态行为的支持。
第03讲:契约版本处理
课程简介:客户端依赖使用WSDL(Web Services描述语言)所定义的契约来与服务进行通信。WSDL契约描述了在每个服务终结点(service endpoint)中可用的操作,以及与每个操作相关的消息的格式和大纲。对于已经发布的契约进行更改可能会对已经存在的客户端产生兼容性问题。为了保证其向后兼容性,在本次webcast中,我们将集中讨论契约的版本控制。我们将为严格和非严格的契约版本控制提供解决方案,向大家介绍如何设计服务契约以及数据契约以适应版本所发生的变化,并且还将向大家介绍如何使用给支持服务所用的业务逻辑组件带来最小影响的方法来处理服务契约和数据契约的外部版本问题。
第04讲:异常与错误处理
课程简介:在分布式系统中,发生在远程的异常在到达客户端之前必须要穿过进程或者计算机的边界。在面向服务的架构(SOA)中,边界可能是位于同一个进程中的服务边界,也可能是跨越进程或者计算机的边界。在这些分布式边界之外,还存在着很多技术和平台的边界。在本次webcast中,我们将介绍SOAP错误和他们与服务元数据的关系(服务端抛出异常的标准)。我们还将讨论在WCF中的不同异常处理场景,包括服务端和客户端如何处理公共语言运行时(CLR)异常,如何声明和抛出SOAP错误,以及如何为使用IErrorHandler的服务提供公共异常处理行为。我们还将介绍在客户端异常处理中契约设计与实现的相关内容。
第05讲:绑定(Bindings)
课程简介:目前,我们已经学习了如何使用一些标准的绑定(如:NetTcpBinding和BasicHttpBinding)来暴露服务的端点。事实上,服务的每个端点都需要与特定的绑定相关。绑定描述了传输协议,数据的编码格式,以及定义通讯信道所需的消息协议。在本次课程中,我们将向大家介绍如何绑定配置以创建通信信道,并且详细向大家介绍每种标准绑定,以及它们的核心协议和特征。我们还将涉及到应用标准绑定的一些场景的分析,对于场景中应用的配置进行描述,并且向大家介绍当标准绑定无法满足我们的需求的时候,如何应用自定义绑定。&
第06讲:宿主(Hosting)
课程简介:对于一个能够在运行时提供访问的服务, 其必须要运行在托管进程的宿主中。WCF服务能够以IIS 6.0和安装了新的WAS(Windows Process Activation Service)的IIS 7.0或者任何托管应用程序进程(如:控制台, Windows Form, WPF, Windows服务应用程序)为宿主来运行。为服务选择正确的宿主环境需要由应用程序部署时的场景来影响,这包括对于传输协议的要求和操作系统平台的要求。当然,对于每个不同类型的宿主环境而言,它们自身的特性也在很大程度上影响着部署的决策和宿主的选择。在本次课程中,我们将向大家描述宿主环境应该具备的特性以及WCF服务宿主的一些基本概念。对于具体的宿主环境,我们将向大家介绍Windows应用程序,Windows服务,IIS以及WAS这些宿主环境的特性。在课程中,我们将向大家岩石每种宿主平台的具体实现操作,以帮助大家能够更加深入地了解这些特性,丰富大家如何正确地选择宿主环境的知识。&
第07讲:消息模式
课程简介:当我们在构建分布式企业系统的时候,多种类型的消息交换能够满足不同通讯模式的需要。在本次课程中,我们将通过演示讨论不同类型的消息模式并且向大家介绍如何使用它们来满足服务中不同的部署和通讯需求。例如,使用MTOM和流技术对于大消息的处理,讨论如何使用经典的消息交换模式,讨论服务契约设计所带来的影响,以及在通讯方面对于“请求/回应“的单向操作和回调操作(双向)。另外,对于经典的发布者与订阅者模式的实现以及路由也会进行讨论。
第08讲:实例模型
课程简介:通过对WCF服务进行配置,服务实例的生命周期能够被限制在请求过程中,客户端会话(代理的实例)的持续过程中,甚至在单件服务中保持到“永远”。根据客户端期望的调用模式,状态处理的需求,以及对于服务请求所期望的吞吐量,不同的应用程序对于服务生命周期的正确选择是不同的。在WCF中,实例模型控制着服务对象分配的方法以处理请求,根据服务类型的不同的实例模型,对于服务端点的每个请求都会被适当的服务对象所处理。在本次课程中,我们将向大家介绍不同的实例模型(如:call, session和单件),并且对于它们的调用和生命周期的特征进行介绍,同时对于每种实例模型,还将介绍其适合的应用场景。
第09讲:并发,吞吐量与限流
课程简介:部署服务作为大规模企业系统的一部分通常会遇到一些带有相互冲突的目标的特性。一方面,需要能够对尽可能多的并发请求进行处理。另一方面,可能需要对请求进行限流,以使得服务器的负载不会过重。在本次课程中,我们将探索WCF为管理并发访问与限流访问所提供的特性。学习如何配置服务以允许线程重入或者并发地访问特定的服务实例,理解这些设置如何与实例模型相关,并且发现如何使用WCF或者Microsoft .NET多线程技术来保护并发访问。我们还将讨论WCF如何分配线程以处理并发请求,解释如何对请求进行限流,并且对基于实例模型的经典配置提供指导。同时还将对于与WCF服务相关的负载平衡与错误切换进行讨论。&
第10讲:安全基础
课程简介:通过提供大量的在传输与消息级别的缺省安全设置,WCF默认情况下是安全的。然而,为了提供适当的安全限制,我们通常需要对WCF的绑定配置进行修改。在本次课程中,我们将从安全的基本概念开始,如:认证,授权,消息级别的安全性,如何应用数字签名与加密。然后,我们将探索多种在企业系统中为服务常用的部署场景以及与这些场景相关的安全配置。
第11讲:联合安全
课程简介:在WCF中,安全模型支持丰富的,基于声明方式的认证。事实上,任何安全令牌都能够被表示为一组声明,例如Windows认证,用户名与密码,或者X509证书。规范化声明是联合安全模型的核心,它允许开发者对于令牌如何映射到一组指定域的声明与用户如何基于这些声明进行验证实现松耦合化的开发。在本次课程中,我们将向您展示如何使用自定义认证策略,权限以及属性,来构建基于声明的安全模型。学习联合模型如何允许开发者在业务逻辑的实现中使用WSFederationHttpBinding实现认证与授权的松耦合。我们还将讨论SAML令牌,描述如何创建自定义声明,并且检查客户端,令牌发布者与服务之间的通讯流是如何工作的。
第12讲:可靠性消息
课程简介:当我们向远程服务发送消息时,我们通常需要确认消息确实已经送达。而如果当消息没有送达时,我们通常希望能够再次尝试,或者采取适当的行为。通常,这些消息递送保证是由一些传输协议来提供的,例如TCP协议或者命名管道。然而这些措施之能够保证点对点的情况。如果通讯过程在发送者与接受者之间存在中介,例如:代理服务器或者消息路由器,那么在经过第一个网络节点后,将无法保证其可靠性。在本次课程中,我们将向大家介绍可靠性会话。这是WCF中通过使用WS-ReliableMessaging(WS-RM)在消息级别进行可靠性保证的一个绑定的特征。在课程中,我们将向大家介绍如何在标准绑定中打开可靠性会话,理解WS-RM的工作原理,并且如何使用自定义绑定来控制可靠性的设置。
第13讲:事务
课程简介:事务是高可靠性系统的关键部分。当两个或者多个操作要求在一个原子任务内完成时,为了保证ACID(原子性,一致性,隔离性,持久性)特性,事务性要求通常是必须的。在开发中,事务的这些特点可以通过事务编程来实现。在.NET平台下,从2.0版本开始,提供了事务初始化等高级特性。WCF利用这些服务,不但能够实现基本的事务功能,也能够实现跨进程或者主机边界的分布式事务。另外,在WCF中,通过Web服务协议(WS-AtomicTranscation,简称为WS-AT)还能够提供基于Web服务的事务性特性。在本次课程中,我们将向大家展示如何使用WCF提供的事务功能,并且介绍如何配置分布式事务协调器(DTC)来支持WS-AT,并且还将向大家解释如何配置WCF客户端与服务以支持在任何协议上的事务特性。&
第14讲:消息队列
课程简介:在分布式系统中,队列调用是实现可靠性的另一种方法。当开发者使用经典的请求/应答模式来发送消息时,回应通常表示请求是否成功。在one-way的消息情况下,由于不存在回应,要确认消息成功到达目的地并且被成功处理是一件非常困难的事情。根据应用场景,在one-way调用中,虽然开发者可能并不关心调用是否成功,但是其一定会关心消息是否确实送达到目的地。与我们前面介绍的可靠性会话不同的是,通过将消息保存在持久化消息队列中,队列调用不但通过分散工作给其它的线程或者计算机以改进系统的性能,还能够保证消息一定能够被送达而不会被丢失。在本次课程中,我们将向大家介绍如何在WCF上使用微软消息队列(MSMQ),并且向大家演示在实际的场景中消息队列服务所带来的帮助。另外,还将向大家介绍NetMsmqBinding的不同的配置方法,以及其如何实现的系统可靠性与安全性。
第15讲:扩展性
课程简介:如同WCF所提供的丰富的特性一样,开发者可以利用服务模型实现更多特性的扩展。例如,下面就列出了一些开发者需要自定义WCF扩展的原因:标准化的编码习惯,为宿主与信道的初始化提供缺省操作,为消息处理添加新的行为,控制消息如何被处理,提供标准化的错误处理语义,对安全模型进行扩展以支持自定义验证或者授权技术,跨服务边界的操作,控制元数据的生成,创建自定义通讯与消息协议,在本次课程中,我们将为大家就扩展性方面提供相应的列表及其使用目的,并且向大家演示它们的一些经典用法与解决方案。&
下载地址:
构建WCF面向服务的应用程序系列课程(共15讲).rar[196.99 MB]
← 上一篇:
分享到微信朋友圈WCF编程(第2版) (Juval Lowy) PDF扫描版
WCF编程(第2版)
书籍大小:55MB
书籍语言:简体中文
书籍类型:
书籍授权:免费软件
更新时间:
书籍类别:C/C++/C#
购买链接:
网友评分:
应用平台:
93MB | 简体中文
36.2MB | 简体中文
31MB | 简体中文
30MB | 简体中文
96MB | 简体中文
70MB | 简体中文
159MB | 简体中文
148MB | 简体中文
65.2MB | 简体中文
下载错误?
WCF编程(第2版) (Juval Lowy) PDF扫描版

我要回帖

更多关于 获取元素的自定义属性 的文章

 

随机推荐