Инспектор сообщений RouterService WCF 4.0 - PullRequest
2 голосов
/ 08 ноября 2010

Я использую новый .Net 4.0 RouterService и у меня есть требование, чтобы маршрутизатор регистрировал сообщения, идущие туда и обратно. Мне нужно сделать это путем доступа к фактическому маршрутизируемому сообщению.

Как программно реализовать MessageInspector на маршрутизаторе? Или есть какая-то альтернатива использованию MessageInspector?

1 Ответ

1 голос
/ 09 ноября 2010

Нашел ответ:

internal class MessageLogger : IClientMessageInspector, IDispatchMessageInspector, IEndpointBehavior {
    private readonly ILoggingProvider _Logging;

    public MessageLogger(ILoggingProvider logging) {
        _Logging = logging;
    }

    #region IDispatchMessageInspector Members

    public object BeforeSendRequest(ref Message request, IClientChannel channel) {
        _Logging.LogMessage("Routing message to service");
        return null;
    }

    public void AfterReceiveReply(ref Message reply, object correlationState) {
        _Logging.LogMessage("Response from service received");
    }

    #endregion


    #region IDispatchMessageInspector Members

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) {
        _Logging.LogMessage("Message received from client");

        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState) {
        _Logging.LogMessage("Sending response to client");
    }

    #endregion

    #region IEndpointBehavior Members

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {
        return;
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
        clientRuntime.MessageInspectors.Add(this);
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(this);
    }

    public void Validate(ServiceEndpoint endpoint) { return; }

    #endregion
}

Затем подключитесь к конечной точке маршрутизатора следующим образом:

public class RouterServiceHost : ServiceHost {
    ...
    public RouterServiceHost() {
        ...
        var endpoint = this.AddServiceEndpoint(routerContract, routerBinding, routerAddress);
        endpoint.Behaviors.Add(new MessageLogger(_Logging));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...