我有几个 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 ClaimsAuthenticationManager
和 ClaimsAuthorizationManager
并发现它们的 Authenticate
和 CheckAccess
方法在 AfterReceiveRequest 之前调用
在 DispatchMessageInspector
上。
由于我需要一个在 CheckAccess 之前调用的扩展点,所以我最终使用了一个实现 IInstanceContextProvider
的类。
关于c# - 在某些 SOAP 服务中未调用 IDispatchMessageInspector.AfterReceiveRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32814406/