![](/img/trans.png)
[英]Is it safe to throw a fault exception from IDispatchMessageInspector.AfterReceiveRequest
[英]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());
在行為類中,我向 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
,從未繼續調用端點行為的AfterReceiveRequest
。
我使用 WIF ClaimsAuthenticationManager
和ClaimsAuthorizationManager
擴展了 Carlos Figueira 非常有用的命令行工具,發現它們的Authenticate
和CheckAccess
方法在DispatchMessageInspector
上的AfterReceiveRequest
之前調用。
因為我需要一個在 CheckAccess 之前調用的擴展點,所以我最終使用了一個實現IInstanceContextProvider
的類
但是我在沒有實現 IInstanceContextProvider 的情況下讓它工作。 只需通過 contractbehavior 而不是端點行為連接你的檢查器對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.