2011-11-10 19 views
19

में पंजीकृत नहीं होगा मेरे पास एक कस्टम सीरियलाइज़र के रूप में Json.NET (newtonsoft) का उपयोग कर एक कार्यरत अनुप्रयोग है। वर्तमान में मैं एक कस्टम WebServiceHostFactory में WebHttpBehavior का व्युत्पन्न जोड़ रहा हूं। मैंने इसे कैसे संलग्न किया है, इसके लिए this blog के अंत में कोड स्निपेट देखें।कस्टम व्यवहार मेरे web.config

जैसा कि मैं आईआईएस में इस सेवा को होस्ट कर रहा हूं, मैं अपने कस्टम होस्टिंग कोड से छुटकारा पाना चाहता हूं और बस अपने web.config पर कस्टम व्यवहार जोड़ना चाहता हूं। प्रक्रिया इस msdn article में दिखाया गया है।

तो मुझे लगता है कि ऐसा करने की तरह का प्रयास करें:

<behaviors> 
    <endpointBehaviors> 
    <behavior name="jsonRest"> 
     <webHttp defaultOutgoingResponseFormat="Json" /> 
     <NewtonsoftJsonBehavior/> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="NewtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehavior, NewtonsoftJsonExtensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 

दुःख की बात है मुझे लगता है कि काम करने के लिए असमर्थ हूँ। जब मैं ऐसा, विजुअल स्टूडियो मुझसे कहता है

तत्व के व्यवहार 'अमान्य चाइल्ड तत्व' NewtonsoftJsonBehavior '

afforementioned msdn article में है, यह उस

को जोड़ने के लिए कहा है तत्व के लिए कॉन्फ़िगरेशन क्षमताओं, आपको एक कॉन्फ़िगरेशन तत्व लिखने और पंजीकृत करने की आवश्यकता है। इस पर अधिक जानकारी के लिए, System.Configuration दस्तावेज़ीकरण देखें।

तत्व और उसके कॉन्फ़िगरेशन प्रकार को परिभाषित करने के बाद, एक्सटेंशन का उपयोग किया जा सकता है, जैसा कि निम्न उदाहरण में दिखाया गया है।

मुझे यह महसूस हो गया है कि मैं जो खो रहा हूं वह ठीक है। किसी भी तरह से तत्व और उसके विन्यास प्रकार पंजीकरण। अफसोस की बात है कि मैं System.Configuration के सिर या पूंछ नहीं बना सकता जो मुझे यह बताना है कि यह कैसे करना है। तो यह मूल रूप से मेरा प्रश्न है:

मैं कॉन्फ़िगरेशन तत्व कैसे लिखूं और पंजीकरण करूं, और यदि यह मेरी समस्या नहीं है, तो समस्या क्या है?

अग्रिम में बहुत धन्यवाद!

उत्तर

37

गुम टुकड़ा वर्ग व्यवहार एक्सटेंशन एक्सटेंशन है। ओपी में मैं WebHttpBehavior-व्युत्पन्न को तत्व के रूप में जोड़ने का प्रयास कर रहा था। व्यवहार एक्सटेंशन एक्सटेंशन, कॉन्फ़िगर-पार्सर को बताता है जो किसी निश्चित तत्व के लिए उपयोग करने के लिए टाइप करता है।

यहाँ कार्यान्वयन मैं जरूरत है:

public class NewtonsoftJsonBehaviorExtension : BehaviorExtensionElement 
{ 
    public override Type BehaviorType 
    { 
     get { return typeof(NewtonsoftJsonBehavior); } 
    } 

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

यह अपने कस्टम WebServiceHostFactory से छुटकारा पाने के निश्चित रूप से पर्याप्त नहीं था।मैं भी एक कस्टम ContentTypeMapper जोड़ने के लिए किया था के लिए:

public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper 
{ 
    public override WebContentFormat GetMessageFormatForContentType(string contentType) 
    { 
     return WebContentFormat.Raw; 
    } 
} 

मैं तो मेरे Web.config में उन्हें इस्तेमाल कर सकते हैं। कार्य कॉन्फ़िगरेशन के प्रासंगिक भाग यहां दिए गए हैं। सबसे पहले एक्सटेंशन सेट अप करने और इसके साथ एक व्यवहार को विन्यस्त:

<extensions> 
    <behaviorExtensions> 
    <add name="newtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehaviorExtension, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="jsonRestEndpointBehavior"> 
     <webHttp/> 
     <newtonsoftJsonBehavior/> 
    </behavior> 
    </endpointBehaviors> 
<behaviors> 

फिर अपने कस्टम contentTypeMapper के साथ एक WebHttpBinding को विन्यस्त:

<bindings> 
    <webHttpBinding> 
    <binding name="newtonsoftJsonBinding" contentTypeMapper="Newtonsoft.Json.Extensions.NewtonsoftJsonContentTypeMapper, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </webHttpBinding> 
</bindings> 

अंत में एक अंतिम बिंदु से ऊपर उपयोग की स्थापना:

<services> 
    <service name="My.Namespaced.MyService" behaviorConfiguration="jsonRestServiceBehavior"> 
    <endpoint address=""    behaviorConfiguration="jsonRestEndpointBehavior" 
       binding="webHttpBinding" bindingConfiguration="newtonsoftJsonBinding" 
       contract="My.Namespaced.IMyService" /> 
    </service> 
</services> 

आशा है कि यह सामान किसी को वहां मदद करेगा। :)

2

यदि आप svcconfigeditor के साथ यह app.config खोलते हैं, तो इसे न्यूटॉन्सॉफ्ट जेसनबेयरर से जुड़े असेंबली का चयन करने के लिए कहना शुरू करना चाहिए। यदि आप इसे चुनते हैं, और app.config को फिर से सहेजते हैं, तो क्या यह आपकी समस्या का समाधान करता है?

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

+0

मैं कल svcconfigeditor की पहली चीज़ कोशिश करूंगा और वापस रिपोर्ट करूंगा। दूसरे भाग के लिए, जब मैं अपना ऐप चलाने की कोशिश करता हूं, तो सेवा को कॉल करना ब्राउज़र में मेरा web.config दिखाता है और कस्टम टैग को हाइलाइट करता है क्योंकि सेवा क्यों नहीं चल सकती है। सटीक संदेश याद नहीं है, लेकिन कल भी पोस्ट कर सकते हैं, अगर इससे मदद मिलेगी। – Mithon

+0

ने स्वयं का जवाब जोड़ा, लेकिन मुझे SvcConfigEditor को इंगित करने के बाद से ऊपर उठाया गया जिससे मुझे ट्रैक करने में मदद मिली जो मुझे करने की ज़रूरत थी। – Mithon