2012-04-27 61 views
0

我需要在IClientMessageInspector中做一些操作日誌記錄,並知道操作何時開始並結束至關重要。但我不能得到AfterReceiveReply單向操作,這是明確的原因。有沒有辦法知道在BeforeSendRequest超載中操作是單向的,所以我可以忽略它?IClientMessageInspector檢測單向操作

回答

1

檢查器本身沒有任何信息(或傳遞給BeforeSendRequest的消息),但可以將此信息傳遞給檢查器,並使用消息操作來查看操作是否是單向的。

public class StackOverflow_10354828 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     string Echo(string text); 
     [OperationContract(IsOneWay = true)] 
     void Process(string input); 
    } 
    public class Service : ITest 
    { 
     public string Echo(string text) 
     { 
      return text; 
     } 
     public void Process(string input) { } 
    } 
    class MyInspector : IClientMessageInspector 
    { 
     public HashSet<string> oneWayActions; 

     public MyInspector(ServiceEndpoint endpoint) 
     { 
      this.oneWayActions = new HashSet<string>(); 
      foreach (var operation in endpoint.Contract.Operations) 
      { 
       if (operation.IsOneWay) 
       { 
        oneWayActions.Add(operation.Messages[0].Action); 
       } 
      } 
     } 

     public void AfterReceiveReply(ref Message reply, object correlationState) 
     { 
      Console.WriteLine("In AfterReceiveReply"); 
     } 

     public object BeforeSendRequest(ref Message request, IClientChannel channel) 
     { 
      Console.WriteLine("In BeginSendRequest"); 
      if (this.oneWayActions.Contains(request.Headers.Action)) 
      { 
       Console.WriteLine("This is a one-way operation"); 
      } 

      return null; 
     } 
    } 
    class MyBehavior : IEndpointBehavior 
    { 
     public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
     { 
     } 

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

     public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
     { 
     } 

     public void Validate(ServiceEndpoint endpoint) 
     { 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress)); 
     factory.Endpoint.Behaviors.Add(new MyBehavior()); 
     ITest proxy = factory.CreateChannel(); 
     proxy.Echo("Hello"); 
     Console.WriteLine(); 

     proxy.Process("world"); 
     Console.WriteLine(); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
1

回覆自己,一個瞬間我這樣做:

布爾isOneWay = request.Headers.ReplyTo == NULL;