2012-04-25 6 views
8

मैं क्रमशः IClientMessageInspector, IDispatchMessageInspector का उपयोग कर क्लाइंट साइड और सर्वर दोनों तरफ डब्ल्यूसीएफ मैसेजेज का निरीक्षण कर सकता हूं। लेकिन डुप्लेक्स संचार में यह स्पष्ट नहीं है कि सर्वर से क्लाइंट के कॉलबैक में इसे कैसे करें (उस विषय पर अधिक दस्तावेज नहीं)।कॉलबैक दिशा में डब्ल्यूसीएफ संदेशों का निरीक्षण करें?

इस सुविधा को कार्यान्वित करने के तरीके के बारे में कोई विचार?

+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा है। – Anuraj

उत्तर

6

अंत में मुझे समाधान मिल गया।

डुप्लेक्स कॉम्यूनिकेशन परिदृश्य में जब कॉलबैक बनाया जाता है तो सर्वर क्लाइंट बन जाता है और इसके विपरीत।

इसलिए IServiceBehavior को कार्यान्वित करते समय सर्वर पक्ष पर DispatchRuntime foreach EndpointDispatcher की CallbackClientRuntime प्रॉपर्टी का उपयोग करके संदेश निरीक्षक को इंजेक्ट करता है।

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

ग्राहक पक्ष पर लागू करते समय IEndpointBehavior 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());  
} 

फिर एक्सटेंशन को हमेशा के रूप में लागू करें।

मेरे मामले में मैं निम्नलिखित छद्म कोड

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

तो मैं सेवा के लिए सर्वर साइड निरीक्षण के लिए कार्यान्वयन इस विशेषता लागू किया की तरह एक वर्ग बनाया है और अंत बिंदु सेटअप करने के लिए app.config के अंदर एक behaviorExtensions जोड़ा ग्राहक पक्ष पर संदेश निरीक्षण के लिए।

<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>