关于WCF的一个非常“无语”的BUG!

发表于:2018-6-21 15:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:蒋金楠    来源:博客园

#
Bug
分享:
  这确实是一个让人觉得“无语”的BUG,甚至让我觉得微软在故意和我们开玩笑。这个问题在我刚刚接触WCF的时候就遇到过,换言之,这个问题一直存在于.NET 3.0、3.5和现在的4.0。这是一个关于在你对WCF进行扩展的时候会经常碰到的问题,读者朋友们可以根据下面的步骤来再现这一个问题。
  创建自定义行为(服务行为、终结点行为、契约行为和操作行为)是对WCF进行扩展最为常用的形式。通过下面的代码,我们创建了一个自定义的服务行为,为了简单我们没有编写任何逻辑代码。
  1: namespace Artech.Bug4BehaviorExtension
  2: {
  3:     public class FooBehavior : IServiceBehavior
  4:     {
  5:         public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
  6:
  7:         public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
  8:
  9:         public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
  10:     }
  11: }
  自定义服务行为可以通过两种方式应用到WCF运行时框架中:自定义特性(Attribute)和配置。现在我们采用后面一种,为此我们需要为上面创建的FooBehavior创建相应的BehaviorExtensionElement(本质上是一个ConfigurationElement):FooBehaviorElement。
  1: namespace Artech.Bug4BehaviorExtension
  2: {
  3:     public class FooBehaviorElement : BehaviorExtensionElement
  4:     {
  5:         public override Type BehaviorType
  6:         {
  7:             get { return typeof(FooBehavior); }
  8:         }
  9:
  10:         protected override object CreateBehavior()
  11:         {
  12:             return new FooBehavior();
  13:         }
  14:     }
  15: }
  接下来,我们创建一个简单的WCF服务来使用上面的服务行为,下面是服务和服务契约的定义。
  1: namespace Artech.Bug4BehaviorExtension
  2: {
  3:     [ServiceContract(Namespace="http://www.artech.com/")]
  4:     public interface ICalculator
  5:     {
  6:         [OperationContract]
  7:         double Add(double x, double y);
  8:     }
  9:
  10:     public class CalculatorService : ICalculator
  11:     {
  12:         public double Add(double x, double y)
  13:         {
  14:             return x + y;
  15:         }
  16:     }
  17: }
  我采用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>
  3:     <system.serviceModel>
  4:         <behaviors>
  5:             <serviceBehaviors>
  6:                 <behavior name="myServiceBehavior">
  7:                     <foo/>
  8:                     <serviceMetadata httpGetEnabled="true"/>
  9:                 </behavior>
  10:             </serviceBehaviors>
  11:         </behaviors>
  12:         <extensions>
  13:             <behaviorExtensions>
  14:                 <add name="foo" type="Artech.Bug4BehaviorExtension.FooBehaviorElement, Artech.Bug4BehaviorExtension" />
  15:             </behaviorExtensions>
  16:         </extensions>
  17:         <services>
  18:             <service behaviorConfiguration="myServiceBehavior" name="Artech.Bug4BehaviorExtension.CalculatorService">
  19:                 <endpoint binding="ws2007HttpBinding" contract="Artech.Bug4BehaviorExtension.ICalculator" />
  20:                 <host>
  21:                     <baseAddresses>
  22:                         <add baseAddress="http://127.0.0.1:3721/calculatorservice" />
  23:                     </baseAddresses>
  24:                 </host>
  25:             </service>
  26:         </services>
  27:     </system.serviceModel>
  28: </configuration>

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号