2012-04-25 36 views
8

Tôi có thể kiểm tra các rối loạn WCF trên cả phía máy khách và phía máy chủ bằng cách sử dụng IClientMessageInspector, IDispatchMessageInspector tương ứng. Nhưng trong một comunications Duplex nó không phải là rõ ràng làm thế nào để làm điều đó trong một cuộc gọi lại từ máy chủ cho khách hàng (cũng không nhiều tài liệu về chủ đề đó).Kiểm tra tin nhắn WCF theo hướng gọi lại?

Bất kỳ ý tưởng nào về cách triển khai tính năng này?

+0

Tôi cũng đang gặp phải vấn đề tương tự. – Anuraj

Trả lời

6

Cuối cùng tôi nhận được giải pháp.

Trong trường hợp giao tiếp song công khi gọi lại được thực hiện, máy chủ sẽ trở thành ứng dụng khách và ngược lại.

Vì vậy, ở phía máy chủ khi triển khai IServiceBehavior, hãy tiêm trình kiểm tra thư bằng cách sử dụng thuộc tính CallbackClientRuntime của DispatchRuntime foreach EndpointDispatcher.

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
{ 
    foreach (ChannelDispatcher item in serviceHostBase.ChannelDispatchers) 
    { 
     foreach (EndpointDispatcher epd in item.Endpoints) 
     { 
      //injecting an inspector in normal call 
      epd.DispatchRuntime.MessageInspectors.Add(new MessageSizerInspector()); 

      //injecting an inspector in callback 
      epd.DispatchRuntime.CallbackClientRuntime.MessageInspectors.Add(new MessageSizerInspector()); 
     } 
    } 
} 

Phía máy khách khi thực thi IEndpointBehavior sẽ truyền thanh tra thư bằng cách sử dụng CallbackDispatchRuntime.

public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
{ 
    //injecting an inspector in normal call 
    clientRuntime.MessageInspectors.Add(new MessageSizerInspector()); 

    //injecting an inspector in callback 
    clientRuntime.CallbackDispatchRuntime.MessageInspectors.Add(new MessageSizerInspector());  
} 

Sau đó, áp dụng tiện ích mở rộng như mọi khi.

Trong trường hợp của tôi, tôi tạo ra một lớp học như mã giả sau

public class MessageSizer : Attribute, IServiceBehavior, IEndpointBehavior 
{ 
    ..... 
} 

sau đó tôi áp dụng thuộc tính này để phục vụ thực hiện cho máy chủ kiểm tra bên và thêm một behaviorExtensions bên trong app.config để thiết lập các thiết bị đầu cuối để kiểm tra tin nhắn ở phía khách hàng.

<system.serviceModel> 
    ........... 
    <client> 
     <endpoint address="net.tcp://localhost/MinerDual.svc" 
      binding="netTcpBinding" bindingConfiguration="wsDualMinerNetTcp" 
      contract="WebApplication.IMinerDual" name="NetTcpMinerDual" 
      behaviorConfiguration="Default" /> 
    </client> 
    <behaviors> 
    <endpointBehaviors > 
     <behavior name="Default"> 
     <messageSizer/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <extensions> 
    <behaviorExtensions> 
     <add name="messageSizer" 
      type="WCFExtensions.MessageSizerElement, WCFExtensions, 
      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
    </extensions> 
</system.serviceModel> 
Các vấn đề liên quan