这确实是一个让人觉得“无语”的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),我们将立即处理。