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
我有工作的 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