.net IDispatchMessageInspector无法使用WCF服务

.net IDispatchMessageInspector无法使用WCF服务,.net,wcf,windows-services,.net,Wcf,Windows Services,我有工作的WCF服务,我需要添加一些关于授权的功能。我已经创建了从ServiceAuthorizationManager继承的类,并成功地将其添加到app.config中。它工作正常 我还需要实现实现IDispatchMessageInspector的类,这样我就可以进行一些消息验证 我遵循了许多例子,如、、和其他一些例子。也有类似的问题 它们在app.config文件中似乎都有相同的配置。然而,当我尝试这样做并运行代码时,似乎在调试时从未调用实现IDispatchMessageInspecto

我有工作的WCF服务,我需要添加一些关于授权的功能。我已经创建了从
ServiceAuthorizationManager
继承的类,并成功地将其添加到
app.config
中。它工作正常

我还需要实现实现
IDispatchMessageInspector
的类,这样我就可以进行一些消息验证

我遵循了许多例子,如、、和其他一些例子。也有类似的问题

它们在
app.config
文件中似乎都有相同的配置。然而,当我尝试这样做并运行代码时,似乎在调试时从未调用实现
IDispatchMessageInspector
的类。我添加了断点,但它们从未被击中

我错过了什么明显的东西吗

<extensions>
  <behaviorExtensions>
    <add name="MessageInspectorBehaviourExtension" type="MultipleEndpoints.MessageInspectorBehaviourExtension, RL_Managed_Service" />
  </behaviorExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
    <behavior name="RLServiceBehavior">
      <serviceDebug includeExceptionDetailInFaults="False"/>
      <serviceAuthorization serviceAuthorizationManagerType="MyProject.Services.AuthorizationService,MyProject"/>
      <MessageInspectorBehaviourExtension />
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="RLServiceBehavior" name="MultipleEndpoints.RL_Managed_Service">
    <endpoint address="" binding="basicHttpBinding" contract="MultipleEndpoints.container_db_ops" bindingConfiguration="TransportSecurity"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <!--  --><add baseAddress="http://localhost:49224/My_Service/"/>
      </baseAddresses>
    </host>
  </service>
</services>

在您修复配置后,我想我知道原因了。您尝试将您的行为扩展注册为服务行为,而
IDispatchMessageInspector
应该在端点级别注册(如中所示-请参见最后一个示例)。 以下是适用于您的配置文件:

<extensions>
  <behaviorExtensions>
    <add name="MessageInspectorBehaviourExtension" type="MultipleEndpoints.MessageInspectorBehaviourExtension, RL_Managed_Service" />
  </behaviorExtensions>
</extensions>
<behaviors>
  <serviceBehaviors>
    <behavior name="RLServiceBehavior">
      <serviceDebug includeExceptionDetailInFaults="False"/>
      <serviceAuthorization serviceAuthorizationManagerType="MyProject.Services.AuthorizationService,MyProject"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="RLEndpointBehavior">
      <MessageInspectorBehaviourExtension />
    </behavior>
  </endpointBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="RLServiceBehavior" name="MultipleEndpoints.RL_Managed_Service">
    <endpoint address="" binding="basicHttpBinding" behaviorConfiguration="RLEndpointBehavior" contract="MultipleEndpoints.container_db_ops" bindingConfiguration="TransportSecurity"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <!--  --><add baseAddress="http://localhost:49224/My_Service/"/>
      </baseAddresses>
    </host>
  </service>
</services>

在您修复配置后,我想我知道原因了。您尝试将您的行为扩展注册为服务行为,而
IDispatchMessageInspector
应该在端点级别注册(如中所示-请参见最后一个示例)。 以下是适用于您的配置文件:

<extensions>
  <behaviorExtensions>
    <add name="MessageInspectorBehaviourExtension" type="MultipleEndpoints.MessageInspectorBehaviourExtension, RL_Managed_Service" />
  </behaviorExtensions>
</extensions>
<behaviors>
  <serviceBehaviors>
    <behavior name="RLServiceBehavior">
      <serviceDebug includeExceptionDetailInFaults="False"/>
      <serviceAuthorization serviceAuthorizationManagerType="MyProject.Services.AuthorizationService,MyProject"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="RLEndpointBehavior">
      <MessageInspectorBehaviourExtension />
    </behavior>
  </endpointBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="RLServiceBehavior" name="MultipleEndpoints.RL_Managed_Service">
    <endpoint address="" binding="basicHttpBinding" behaviorConfiguration="RLEndpointBehavior" contract="MultipleEndpoints.container_db_ops" bindingConfiguration="TransportSecurity"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <!--  --><add baseAddress="http://localhost:49224/My_Service/"/>
      </baseAddresses>
    </host>
  </service>
</services>

我找到了另一种方法,可以注册
IDispatchMessageInspector
,而无需
app.config
。在“OnStart”方法中,您可以简单地在端点之间循环

service = New ServiceHost(GetType(My_Service))

For Each endpoint In service.Description.Endpoints
    If Not endpoint.Contract.Name.Equals("IMetadataExchange") Then
        endpoint.EndpointBehaviors.Add(New MessageInspectorBehaviour)
    End If
Next

我找到了另一种方法,可以注册
IDispatchMessageInspector
,而无需
app.config
。在“OnStart”方法中,您可以简单地在端点之间循环

service = New ServiceHost(GetType(My_Service))

For Each endpoint In service.Description.Endpoints
    If Not endpoint.Contract.Name.Equals("IMetadataExchange") Then
        endpoint.EndpointBehaviors.Add(New MessageInspectorBehaviour)
    End If
Next

只有这篇文章有错误。实际代码有专有名称:(更新了我的答案,提供了更多细节。我100%确信我没有将
服务行为
端点行为
混为一谈。这可能是我的问题。非常感谢;)只有这篇文章有错误。实际代码有专有名称:(更新了我的答案,提供了更多详细信息。我100%确信我没有将
服务行为
端点行为
混为一谈。这可能是我的问题。非常感谢;)