2013-01-03 7 views
7

में सीरियलाइजेशन को नियंत्रित करना मैं एएसपी.नेट वेब एपीआई में कस्टम सीरियलाइजेशन/deserialization कहां निर्दिष्ट कर सकता हूं?वेब एपीआई/एपीकंट्रोलर

हमारे आवेदन के माध्यम से संदेशों के तेज़ क्रमिकरण/deserialization की आवश्यकता है, इसलिए हमें कोड के इस हिस्से को कसकर नियंत्रित करने की आवश्यकता है ताकि हमारे घर-ब्रू या ओएसएस का उपयोग किया जा सके।

मैंने this जैसे विभिन्न स्रोतों की जांच की है जो बताते हैं कि एक कस्टम मूल्य प्रदाता कैसे बनाएं, लेकिन मुझे अभी तक एक ऐसा उदाहरण दिखाई नहीं दे रहा है जो प्रक्रिया समाप्त होने के बारे में बताता है।

क्या कोई मुझे इनकमिंग/आउटगोइंग संदेशों को क्रमबद्ध करने का तरीका दिखा सकता/दिखा सकता है?

वेब एपीआई में विभिन्न इंजेक्शन पॉइंट/इवेंट सिंक का एक चित्र this one for WCF की तरह सराहना की जाती है!

+0

लागू ['ISerializable'] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx)? –

+0

एमएमएम ... ऐसा कोई नहीं है जो चीजों को करने का डब्ल्यूसीएफ तरीका है। – Alwyn

उत्तर

6

विस्तार बिंदु जो आप ढूंढ रहे हैं वह MediaTypeFormatter है। यह अनुरोध निकाय से पढ़ने और प्रतिक्रिया शरीर को लिखने को नियंत्रित करता है। यह अपनी खुद की फ़ॉर्मेटर लिखने के लिए सबसे अच्छा संसाधन हो सकता है: जवाब में मामला कड़ी में

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

+0

ऐसा लगता है कि यह ऐसा है, हालांकि ऐसा लगता है कि प्रति होस्ट केवल एक ही धारावाहिक है इस नियंत्रक को नियंत्रक/क्रिया स्तर पर कॉन्फ़िगर करने का कोई तरीका है? – Alwyn

+0

ऐसा करना संभव है। आप इसे संभालने के कुछ तरीके हैं: 1) या तो आप स्पष्ट रूप से कह सकते हैं कि जब आप अपनी प्रतिक्रिया बनाते हैं तो आप किस फॉर्मेटर का उपयोग करना चाहते हैं। आप जिस फॉर्मेटर का उपयोग करना चाहते हैं उसे चुनने के लिए आप Request.CreateResponse एक्सटेंशन विधि का उपयोग कर सकते हैं। या 2) आप एक विशिष्ट नियंत्रक के लिए स्वरूपण को अनुकूलित करने के लिए प्रति-नियंत्रक कॉन्फ़िगरेशन का उपयोग कर सकते हैं। –

+2

वेबएपीआई में विस्तारशीलता के बारे में एक और अच्छा दस्तावेज़ है: http://www.asp.net/web-api/overview/extensibility/configuring-aspnet-web-api। विशेष रूप से, यह मैंने अभी उल्लेख किए गए प्रति-नियंत्रक कॉन्फ़िगरेशन को समझाया है। –

1

यहाँ कोड उपरोक्त उदाहरण मर जाता है

public class MerlinStringMediaTypeFormatter : MediaTypeFormatter 
{ 
    public MerlinStringMediaTypeFormatter() 
    { 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); 
    } 

    public override bool CanReadType(Type type) 
    { 
     return type == typeof (YourObject); //can it deserialize 
    } 

    public override bool CanWriteType(Type type) 
    { 
     return type == typeof (YourObject); //can it serialize 
    } 

    public override Task<object> ReadFromStreamAsync( 
     Type type, 
     Stream readStream, 
     HttpContent content, 
     IFormatterLogger formatterLogger) 
    { 
     //Here you put deserialization mechanism 
     return Task<object>.Factory.StartNew(() => content.ReadAsStringAsync().Result); 
    } 

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext) 
    { 
     //Here you would put serialization mechanism 
     return base.WriteToStreamAsync(type, value, writeStream, content, transportContext); 
    } 
} 

तो फिर तुम Global.asax

में अपने फ़ॉर्मेटर रजिस्टर करने की आवश्यकता
protected void Application_Start() 
    { 
     config.Formatters.Add(new MerlinStringMediaTypeFormatter()); 
    } 

आशा है कि यह आपको कुछ समय बचाएगा।

संबंधित मुद्दे