2013-03-25 91 views
1

我已经提到了Why isn't my custom WCF behavior extension element type being found?;但以下是不同的问题CreateBehavior()不被调用

我有一个自定义BehaviorExtensionElement,如下所示。运行服务时,它的构造函数正在调用。但它不会调用CreateBehavior()方法。因此我的IEndpointBehavior没有被构建。

服务工作正常,没有任何例外。

任何想法为什么CreateBehavior()方法未被调用?

注意:我正在运行从Visual Studio 2010的Web服务应用程序。

配置

<endpointBehaviors> 
    <behavior name="EndpointBehavior"> 
     <XMessageValidator validateRequest="True" validateReply="true" validateWSE="true"> 
     </XMessageValidator> 
    </behavior> 
    </endpointBehaviors> 


//Other config entries 

<extensions> 
    <behaviorExtensions> 
    <add name="XMessageValidator" type="MessageInspectorLibrary.ValidationBehaviorExtensionElement, MessageInspectors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
</extensions> 

BehaviorExtensionElement

public class ValidationBehaviorExtensionElement : BehaviorExtensionElement 
{ 
    public ValidationBehaviorExtensionElement() 
    { 
     //Constructor 
    } 

    public override Type BehaviorType 
    { 
     get 
     { 
      return typeof(MessageValidationBehavior); 
     } 
    } 

    protected override object CreateBehavior() 
    { 
     throw new Exception("My CreateBehavior"); 
     return null; 

    } 

    [ConfigurationProperty("validateRequest", DefaultValue = false, IsRequired = false)] 
    public bool ValidateRequest 
    { 
     get { return (bool)base["validateRequest"]; } 
     set { base["validateRequest"] = value; } 
    } 

    [ConfigurationProperty("validateReply", DefaultValue = false, IsRequired = false)] 
    public bool ValidateReply 
    { 
     get { return (bool)base["validateReply"]; } 
     set { base["validateReply"] = value; } 
    } 

    [ConfigurationProperty("validateWSE", DefaultValue = false, IsRequired = false)] 
    public bool ValidateWSE 
    { 
     get { return (bool)base["validateWSE"]; } 
     set { base["validateWSE"] = value; } 
    } 

} 

IEndpointBehavior

public class MessageValidationBehavior : IEndpointBehavior 
{ 
    XmlSchemaSet schemaSet; 
    bool validateRequest; 
    bool validateReply; 
    bool validateWSE; 

    public MessageValidationBehavior(XmlSchemaSet schemaSet, bool inspectRequest, bool inspectReply, bool inspectWSE) 
    { 
     this.schemaSet = schemaSet; 
     this.validateReply = inspectReply; 
     this.validateRequest = inspectRequest; 
     this.validateWSE = inspectWSE; 

     throw new Exception("My MessageValidationBehavior"); 
    } 


    #region IEndpointBehavior Members 

    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
    { 
     ValidationMessageInspector inspector = new ValidationMessageInspector(schemaSet, validateRequest, validateReply, validateWSE, true); 
     clientRuntime.MessageInspectors.Add(inspector); 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
    { 
     ValidationMessageInspector inspector = new ValidationMessageInspector(schemaSet, validateRequest, validateReply, validateWSE, false); 
     endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 
    } 

    #endregion 
} 

Refe分配办法

  1. http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6be701c0-25f9-4850-82f9-62a9b8e9ac04/
+0

什么是类ValidationMessageInspector命名空间? – FrenkyB 2017-01-24 09:21:19

回答

1

注:正如我在质询时说,该服务提供了适当的响应消息,即使没有以下变化。此外,ValidationBehaviorExtensionElement类正在被调用。

解决方案

CreateBehavior()时,我的服务名称正确叫做 - 即,namespace.servicename

我的理解是 - BehaviorExtension被创建而不考虑服务名称。但EndPointBehavior仅在服务名称正确时才创建。如果你对此有一些想法/参考,欢迎更多细节。

enter image description here

下面是完整的serviceModel配置

<system.serviceModel> 

<services> 

    <service 
      name="WcfServiceApp001.Service1" 
      behaviorConfiguration="InternalPayrollBehavior"> 
    <endpoint address="" binding="basicHttpBinding" 
       behaviorConfiguration="EndpointBehavior" 
       contract="WcfServiceApp001.IService1" 
       /> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="InternalPayrollBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 

    <endpointBehaviors> 
    <behavior name="EndpointBehavior"> 
     <XMessageValidator validateRequest="True" validateReply="true" validateWSE="true"> 
     </XMessageValidator> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

<extensions> 
    <behaviorExtensions> 
    <add name="XMessageValidator" type="MessageInspectorLibrary.ValidationBehaviorExtensionElement, MessageInspectors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
</extensions> 

<serviceHostingEnvironment multipleSiteBindingsEnabled="false" /> 
</system.serviceModel> 
1

我建议你封装你在behaviors node

<behaviors> 
    .... 
    <endpointBehaviors> 
    <behavior name="EndpointBehavior"> 
     <XMessageValidator validateRequest="True" validateReply="true" validateWSE="true"> 
     </XMessageValidator> 
    </behavior> 
    </endpointBehaviors> 
    .... 
</behaviors> 
+0

它已经在行为节点内。我只是没有把完整的配置。此外,我能够达到ValidationBehaviorExtensionElement构造函数 – Lijo 2013-03-25 12:25:56