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

标签 c# wcf debugging iis endpointbehavior

我有几个 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 应用程序下运行,但我找不到任何不同的内容来解释为什么此检查器无法工作。 检查器不工作的服务也派生自不同的基类,但我从该基类中删除了所有代码,但仍然没有调用该方法。

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

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

最佳答案

我终于发现了我的代码的问题。两个 WCF 服务都有一个 WIF (.NET 4.5) ClaimsAuthorizationManager随附的。调用CheckAccess一项服务返回 true,另一项服务返回 false。返回 false 的那个,从未继续调用端点行为的 AfterReceiveRequest

我扩展了 Carlos Figueira 的非常有用的 commandline tool使用 WIF ClaimsAuthenticationManagerClaimsAuthorizationManager 并发现它们的 AuthenticateCheckAccess 方法在 AfterReceiveRequest 之前调用DispatchMessageInspector 上。

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

关于c# - 在某些 SOAP 服务中未调用 IDispatchMessageInspector.AfterReceiveRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32814406/

相关文章:

linux - Mono 在 Ubuntu 上抛出 OutOfMemoryException,但在 OSX 或 Windows 上则不会

wcf - OAuth 和 WCF SOAP 服务

具有 Http 基本身份验证的 WCF

java - 不幸的是 MyApp 已经停止。我该如何解决这个问题?

c# - 将日期导出到 Csv 并告诉 excel 格式

c# - 使用 C# 和 XML(XDocument) 时出现 ':' 错误

c# - 如何在 asp.net c# 中从浏览器中删除 cookie,所以答案不工作

iphone - 使用 IParameterInspector 验证 WCF 参数并在客户端处理FaultException

iphone - 如何调试或查看USB被占用的iOS设备的NSLog输出?

eclipse - 如何在 eclipse 中调试 Camunda webapps?