IDispatchMessageInspector.AfterReceiveRequest 未在某些 SOAP 服务中调用

IDispatchMessageInspector.AfterReceiveRequest not called in some SOAP services

我有几个 WCF SOAP 服务,它们以编程方式公开一个 IEndPointBehavior 附加到的端点。

var endpoint = AddServiceEndpoint(contractType,
                                  basicBinding,
                                  address);
_logger.Write("Adding behavior for service {0}, contract: {1}", serviceName, cd.Value.ContractType);
endpoint.Behaviors.Add(new MyBehavior());

在行为 class 中,我向 Dispatch 运行时添加了一个消息检查器:

void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, 
        EndpointDispatcher endpointDispatcher)
{
    _logger.WriteError("Adding Inspector to endpoint {0}, contract {1}", endpoint.Address.ToString(), endpoint.Contract.Name);

    endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyInspector());
}

在消息检查器中,我实现了 AfterReceiveRequest 方法,例如:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
    _logger.WriteError("AfterReceiveRequest for {0} via {1}", request.Headers.Action, request.Properties.Via);
     // implementation omitted...
     return null;
}

现在我可以看到我所有服务的 'Adding behavior' 和 'Adding inspector' 日志消息,但是 AfterReceiveRequest 方法只为某些服务调用。

未调用该方法的服务 运行 在 IIS 中的另一个 Web 应用程序下,但我找不到任何不同之处来解释为什么此检查器不起作用。 检查员不在其中工作的服务也来自不同的基础 class,但我从该基础中删除了所有代码 class,但仍然没有调用该方法。

我打开了消息跟踪并确实看到客户端正在调用正确的端点。

有谁知道为什么会发生这种情况,或者我该如何更好地调试它?

我终于找到了我的代码的问题。两个 WCF 服务都有一个 WIF (.NET 4.5) ClaimsAuthorizationManager attached. The call to CheckAccess 为一个服务返回 true,为另一个服务返回 false。它返回 false 的那个,从未继续调用端点行为的 AfterReceiveRequest

我用 WIF ClaimsAuthenticationManagerClaimsAuthorizationManager 扩展了 Carlos Figueira 非常有用的 commandline tool,发现它们的 AuthenticateCheckAccess 方法在AfterReceiveRequestDispatchMessageInspector.

因为我需要一个在 CheckAccess 之前调用的扩展点,所以我最终使用了 class 实现 IInstanceContextProvider

但是我在没有实现 IInstanceContextProvider 的情况下让它工作了.. 只需通过 contractbehavior 而不是端点行为来连接您的检查器对象。