2012-11-14 13 views
13

2 नियंत्रकों के साथ एक आत्म मेजबान वेब एपीआई है:ASP.NET वेब एपीआई नियंत्रक विशिष्ट Serializer

  • नियंत्रक 1 के लिए, मैं डिफ़ॉल्ट DataContractSerializer जरूरत
  • (मैं एफई 5 POCO उजागर कर रहा हूँ) के लिए नियंत्रक 2, मैं पैरामीटर UseXmlSerializer सही पर सेट (मैं एक XmlDocument उजागर कर रहा हूँ)

मैं नियंत्रक प्रारंभ दौरान formatters स्थापित करने के लिए कोशिश की है साथ XmlFormatter आवश्यकता है, लेकिन विन्यास सभी नियंत्रकों को प्रभावित करने, वैश्विक हो रहा है:

public class CustomConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings settings, 
    HttpControllerDescriptor descriptor) 
    { 
     settings.Formatters.XmlFormatter.UseXmlSerializer = true; 

    } 
} 

मैं इसे कैसे हल कर सकता हूं?

उत्तर

0

मुझे लगता है कि आप कस्टम ActionFilterAttribute लिख सकते हैं।

OnActionExecuting में, HttpContext में मूल मानों को संग्रहीत करें और फिर OnActionExecuted में, मूल मानों को पुनर्स्थापित करें।

+0

मैं अपने समाधान की कोशिश की लेकिन फ़ॉर्मेटर नियंत्रकों द्वारा साझा किया जाता के साथ अपने नियंत्रकों को सजाने। मैं दो समवर्ती अनुरोध प्राप्त कर सकता हूं, एक प्रति नियंत्रक, UseXmlSerializer के मूल्य में असंगतता की समस्याएं पैदा कर सकता हूं। – user1824269

0

नियंत्रक कार्य स्वयं को इस बात से चिंतित नहीं होना चाहिए कि डेटा को क्रमबद्ध कैसे किया जाता है। यो डेटा को पुनर्प्राप्त करने के लिए आवश्यक डेटा और किसी भी प्रारूप का अनुरोध करने में सक्षम होना चाहिए।

डिफ़ॉल्ट वेब एपीआई द्वारा जेसन ऑब्जेक्ट्स को क्रमबद्ध किया गया। हालांकि यदि आप xml के अनुरोध के सामग्री प्रकार को सेट करते हैं तो उसे एक ही परिणाम वापस करना चाहिए, लेकिन जेसन के बजाय xml के रूप में स्वरूपित होना चाहिए।

1

विन्यास:

config.Formatters.Remove(config.Formatters.JsonFormatter); 
config.Formatters.Insert(0, new CustomXmlMediaTypeFormatter()); 

कस्टम फ़ॉर्मेटर:

public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter 
{ 
    public CustomXmlMediaTypeFormatter() 
    { 
     UseXmlSerializer = true; 
    } 
} 

यह लगता काम करने के लिए, ठीक है तो सुंदर नहीं। डिफ़ॉल्ट एक्सएमएल फॉर्मेटर को हटाने से काम नहीं होता है, इसलिए मैंने निष्कर्ष निकाला कि ढांचा अभी भी इसका उपयोग कर रहा है।

+0

कई घंटों के लिए आपके उत्तर की तलाश कर रहे थे, अब यह इतना आसान है। मैं समझ नहीं पा रहा हूं कि यह क्यों खोजना मुश्किल था, मैं व्यक्तिगत रूप से DataContractSerializer से नफरत करता हूं। https://msdn.microsoft.com/en-us/library/system.net.http.formatting.xmlmediatypeformatter.usexmlserializer(v=vs.118).aspx – bonitzenator

10

आप सही रास्ते पर बहुत अधिक थे। लेकिन आपको अपने कॉन्फ़िगरेशन विशेषताओं में XmlMediaTypeFormatter का एक नया उदाहरण अनियमित करने की आवश्यकता है अन्यथा आप वैश्विक संदर्भ को प्रभावित करेंगे।

जैसा कि आप जानते हैं, आपको IControllerConfiguration इंटरफ़ेस के आधार पर 2 विशेषताओं को बनाने की आवश्यकता है।

public class Controller1ConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, 
          HttpControllerDescriptor controllerDescriptor) 
    { 
     var xmlFormater = new XmlMediaTypeFormatter {UseXmlSerializer = true}; 

     controllerSettings.Formatters.Clear(); 
     controllerSettings.Formatters.Add(xmlFormater); 
    } 
} 

public class Controller2ConfigAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, 
          HttpControllerDescriptor controllerDescriptor) 
    { 
     var xmlFormater = new XmlMediaTypeFormatter(); 
     controllerSettings.Formatters.Clear(); 
     controllerSettings.Formatters.Add(xmlFormater); 
    } 
} 

फिर प्रासंगिक विशेषता

[Controller1ConfigAttribute] 
public class Controller1Controller : ApiController 
{ 

[Controller2ConfigAttribute] 
public class Controller2Controller : ApiController 
{ 
+0

आश्चर्यजनक रूप से सहायक और बिंदु पर। –