2

我有几个 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());

在行为类中,我向 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;
}

现在我可以看到我所有服务的“添加行为”和“添加检查器”日志消息,但是AfterReceiveRequest方法仅对某些服务调用。

未调用该方法的服务在 IIS 中的不同 Web 应用程序下运行,但我找不到任何不同的东西可以解释为什么该检查器不起作用。检查器不工作的服务也是从不同的基类派生的,但是我从该基类中删除了所有代码,但仍然没有调用该方法。

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

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

4

2 回答 2

2

我终于发现了我的代码的问题。两个 WCF 服务都ClaimsAuthorizationManager附加了 WIF (.NET 4.5)。对一项服务和另一项服务的调用CheckAccess正在返回。它返回错误的那个,从未继续调用端点行为。truefalseAfterReceiveRequest

我用 WIF扩展了 Carlos Figueira 非常有用的命令行工具,发现它们的ClaimsAuthenticationManager和方法在.ClaimsAuthorizationManagerAuthenticateCheckAccessAfterReceiveRequestDispatchMessageInspector

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

于 2015-10-08T03:40:21.690 回答
0

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

于 2016-12-07T07:38:30.300 回答