2010-11-08 58 views
2

我正在使用新的.Net 4.0路由器服務,並要求路由器記錄來回消息。我需要通過訪問正在路由的實際消息來做到這一點。WCF 4.0 RouterService消息Inspector

如何以編程方式在路由器上實現MessageInspector?還是有一些使用MessageInspector的替代方法?

回答

1

找到了答案:

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)); 
    } 
}