IDispatchMessageInspector 不工作 WCF 服务

IDispatchMessageInspector not working WCF services

我有工作的 WCF 服务,我需要在其中添加一些有关授权的功能。我创建了继承自 ServiceAuthorizationManager 的 class,并成功将其添加到 app.config 中。一切正常。

我还需要实现 class,后者实现了 IDispatchMessageInspector,因此我可以进行一些消息验证。

我遵循了很多例子,例如 this, this, this, this, this and some others. Also questions in SO like this

它们在 app.config 文件中似乎都具有相同的配置。但是,当我尝试使用 运行 代码时,似乎 class 实现 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 应该在端点级别注册(如 link you mentioned - 请参阅那里的最后一个示例)。 这是适合您的配置文件:

<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>

我找到了另一种无需 app.config 即可注册 IDispatchMessageInspector 的方法。在“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