簡體   English   中英

某些 SOAP 服務中未調用 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 ClaimsAuthenticationManagerClaimsAuthorizationManager擴展了 Carlos Figueira 非常有用的命令行工具,發現它們的AuthenticateCheckAccess方法在DispatchMessageInspector上的AfterReceiveRequest之前調用。

因為我需要一個在 CheckAccess 之前調用的擴展點,所以我最終使用了一個實現IInstanceContextProvider的類

但是我在沒有實現 IInstanceContextProvider 的情況下讓它工作。 只需通過 contractbehavior 而不是端點行為連接你的檢查器對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM