2011-06-10 18 views
9

में मानक Endpoints का उपयोग करते समय आप एक संदेश निरीक्षक को कॉन्फ़िगर कैसे करते हैं I WCF Rest HTTP अनुरोध के कुछ प्रमाणीकरण करने के लिए संदेश निरीक्षक बनाने और कॉन्फ़िगर करने का प्रयास कर रहा हूं। मैं 4.0 का उपयोग कर रहा हूं इसलिए डब्लूसीएफ स्टार्टर किट को साफ़ करने की कोशिश कर रहा हूं, हालांकि मैं जिस तरह से चाहता हूं, उसमें काम कर रहा एक पुराना RequestInterceptor प्राप्त करने में कामयाब रहा है। RequestInterceptor का उपयोग करने में समस्या यह है कि मैंने WebHttpBehavior द्वारा प्रदान की गई स्वचालित FormatSelectionEnabled सुविधाओं को खो दिया है जो मैं वास्तव में रखना चाहता हूं।WCF REST 4.0

तो मेरा सवाल यह है कि मैं संदेश निरीक्षक को इस तरह से कैसे कॉन्फ़िगर कर सकता हूं कि मैं अभी भी WebHttpBehavior का उपयोग करता हूं और इसकी सुविधाओं को रखता हूं।

मेरे web.config इस

<standardEndpoints> 
    <webHttpEndpoint> 
    <!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. --> 
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" /> 
    <!-- Disable the help page for the directory end point--> 
    <standardEndpoint name="DirectoryEndpoint"/> 
    </webHttpEndpoint> 
</standardEndpoints> 

उत्तर

19

एक तरह से आप को संभाल सकता है इस तीन वस्तुओं बनाने के लिए है की तरह लग रहा है।

  1. संदेश निरीक्षक, अनुरोध/प्रतिक्रिया
  2. सेवा व्यवहार का विश्लेषण करने के लिए जिम्मेदार, स्वचालित रूप से पाइपलाइन
  3. विन्यास खंड में निरीक्षक injects व्यवहार वेब में इस्तेमाल किया जा करने की अनुमति देता .config

पहले IDispatchMessageInspector लागू करने और अपनी सत्यापन कोड डालने के बाद से संदेश निरीक्षक बनाने ReceiveRequest विधि:

public class HmacVerificationInspector : IDispatchMessageInspector 
{ 

    #region IDispatchMessageInspector Members 

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, 
     System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
    { 
      MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
      request = buffer.CreateMessage(); 
      Message dupeRequest = buffer.CreateMessage(); 

      ValidateHmac(dupeRequest); 

      buffer.Close(); 

     return null; 
    } 

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, 
     object correlationState) 
    { 


    } 

    #endregion 
} 

यह जब यह पढ़ने संदेश की एक बफ़र प्रतिलिपि बनाने के लिए महत्वपूर्ण है। संदेशों को केवल एक बार खोला जा सकता है और एक प्रतिलिपि बनाने से पाइप के नीचे समस्याएं पैदा हो जाएंगी। ValidateHmac का मेरा कार्यान्वयन विफल होने पर अपवाद फेंकता है। यह वास्तविक सेवा को बुलाए जाने से रोकता है।

दूसरा, अपने निरीक्षक के लिए एक व्यवहार बनाएं। हम इंस्पेक्टर को डब्ल्यूसीएफ रनटाइम में इंजेक्ट करने के लिए व्यवहार का उपयोग करेंगे। व्यवहार बनाने के लिए, IEndpointBehavior से एक वर्ग निकाले जाते हैं तो यह की तरह इस

public class HmacVerificationBehavior : IEndpointBehavior 
    { 
     #region IEndpointBehavior Members 

     public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
     { 

     } 

     public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
     { 

     } 

     public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
     { 
      HmacVerificationInspector inspector = new HmacVerificationInspector(); 

      endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); 
     } 

     public void Validate(ServiceEndpoint endpoint) 
     { 

     } 

     #endregion 
    } 

सूचना मैं अपने निरीक्षक (HmacVerificationInspector) का एक नया उदाहरण बना सकते हैं और यह प्रोग्राम के रूप में इंजेक्षन क्रम में लग रहा है।

अंत में, अंतिम चरण कॉन्फ़िगरेशन अनुभाग बनाना है। हम वेब कॉन्फ़िगरेशन में व्यवहार को लागू करने के लिए इसका उपयोग कर सकते हैं (इस प्रकार कॉन्फ़िगरेशन के माध्यम से इसे चालू और बंद कर सकते हैं)। एक नया वर्ग बनाएँ और BehaviorExtensionElement और IServiceBehavior से विरासत:

public class HmacVerificationConfigurationSection : BehaviorExtensionElement, IServiceBehavior 
{ 
    #region IServiceBehavior Members 

    public void AddBindingParameters(ServiceDescription serviceDescription, 
     System.ServiceModel.ServiceHostBase serviceHostBase, 
     System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, 
     System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
    { 

    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { 

    } 

    public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { 

    } 

    #endregion 

    public override Type BehaviorType 
    { 
     get { return typeof(HmacVerificationBehavior); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new HmacVerificationBehavior(); 
    } 
} 

अब, निरीक्षक का उपयोग करने के लिए, अपने web.config के लिए निम्न जोड़ने

(यदि आप अपने विस्तार करने के लिए जो कुछ भी आप चाहते हैं के लिए नाम सेट कर सकते हैं)
<system.serviceModel> 
     <extensions> 
      <behaviorExtensions> 
       <add name="hmacVerification" type="NamespaceHere.HmacVerificationConfigurationSection, AssembleyHere, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
      </behaviorExtensions> 
     </extensions> 
     <services> 
      <service name="MySecureService"> 
       <endpoint address="" binding="webHttpBinding" contract="IMySecureService" behaviorConfiguration="web" /> 
      </service> 
     </services> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="web"> 
        <webHttp automaticFormatSelectionEnabled="true" />   
        <hmacVerification /> 
       </behavior> 
      </endpointBehaviors> 
      <serviceBehaviors> 
       <behavior name=""> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 

चीजों का युगल, पहले आप व्यवहार एक्सटेंशन में कॉन्फ़िगरेशन अनुभाग पंजीकृत करते हैं। इसके बाद, आप उस कॉन्फ़िगरेशन को एंडपॉइंट व्यवहार के रूप में उपयोग करते हैं जो तब इंस्पेक्टर को स्वचालित रूप से इंजेक्ट करेगा और उस एंडपॉइंट के सभी अनुरोध आपके इंस्पेक्टर के माध्यम से चलेंगे। यदि आप इंस्पेक्टर को बंद करना चाहते हैं, तो टैग को हटाएं या एक अलग एंडपॉइंट व्यवहार का चयन करें। WebHttp व्यवहार के उपयोग पर भी ध्यान दें (जो आपको स्वचालित FormatSelectionEnabled रखने की अनुमति देगा।

आशा इस

+0

में मदद करता है आप जानते हैं कि मुझे लगता है कि यह पुराना हो सकता है। – control

+0

इसके विपरीत मुझे लगता है कि यह बहुत उपयोगी है। धन्यवाद। – Barun

+0

डब्ल्यूसीएफ संदेश के बारे में बेहतर पोस्ट मैंने बहुत समय में पढ़ा है। आपका बहुत बहुत धन्यवाद। –