C# 未调用CreateBehavior()

C# 未调用CreateBehavior(),c#,.net,wcf,C#,.net,Wcf,我已经提到;但下面是一个不同的问题 我有一个自定义的BehaviorExtensionElement,如下所示。运行服务时,会调用其构造函数。但是,它不调用CreateBehavior()方法。因此,我的IEndPoint行为没有得到构建 这项服务毫无例外地运作良好 知道为什么不调用CreateBehavior()方法吗 注意:我正在从Visual Studio 2010运行web服务应用程序 配置 <endpointBehaviors> <behavior nam

我已经提到;但下面是一个不同的问题

我有一个自定义的BehaviorExtensionElement,如下所示。运行服务时,会调用其构造函数。但是,它不调用CreateBehavior()方法。因此,我的IEndPoint行为没有得到构建

这项服务毫无例外地运作良好

知道为什么不调用
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>
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
}
参考资料


  • 我建议您将自己的行为封装在
    行为节点中

     <behaviors>
      ....
      <endpointBehaviors>
        <behavior name="EndpointBehavior">
          <XMessageValidator validateRequest="True" validateReply="true" validateWSE="true">
          </XMessageValidator>
        </behavior>
      </endpointBehaviors>
      ....
     </behaviors>
    
    
    ....
    ....
    
    注意:正如我在问题中所说的,即使没有以下更改,服务也会给出正确的响应消息。此外,正在调用ValidationBehaviorExtensionElement类

    解决方案

    当我更正服务名称时,调用了
    CreateBehavior()
    ,即
    namespace.servicename

    我的理解是-
    BehaviorExtension
    的创建与服务名称无关。但是只有当服务名称正确时才会创建
    EndPointBehavior
    。如果您对此有一些想法/参考,欢迎提供更多详细信息

    以下是完整的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>
    
    
    
    它已经在行为节点内。我只是没有把完整的配置。我还可以访问ValidationBehaviorExtensionElement构造函数类ValidationMessageInspector的命名空间是什么?
    <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>