2012-04-06 16 views
12

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

हालांकि, मेरे पास एक व्यावसायिक आवश्यकता है जहां हमें xml और json वापस करना होगा जहां xml विशिष्ट प्रारूप में होना चाहिए। विशेषताओं का एक गुच्छा

<service name="service1" type="audio" .../> 

तो मूल रूप से:

उदाहरण के लिए हम ग्राहकों है कि प्रारूप के एक्सएमएल उम्मीद मौजूदा है।

मुझे पता है कि सर्विसस्टैक डीटीओ की अवधारणाओं का उपयोग करता है और DataContractSerializer का उपयोग करता है जो xml विशेषताओं के साथ उपरोक्त रूप में xml तत्व देता है।

मैं अभी भी अनुरोध (स्वीकार करें शीर्षक में आवेदन/xml या application/json में गुजर) के लिए DTOs उपयोग करने के लिए और मैं तो अपने ही एक्सएमएल तार या json तार बना सकते हैं और फिर उन्हें के रूप में वापसी चाहते हैं:

string result = "....xml or json string..."; 
return new MemoryStream(Encoding.UTF8.GetBytes(result)); 

जहां परिणाम स्ट्रिंग एक एक्सएमएल स्ट्रिंग या जेसन स्ट्रिंग हो सकती है।

मैंने फिडलर में प्रतिक्रिया सामग्री प्रकार को टेक्स्ट/एचटीएमएल के रूप में देखा।

जिस दृष्टिकोण के साथ मैं उपयोग कर रहा हूं, क्या मैं किसी भी आरईएसटी सिद्धांतों का उल्लंघन कर रहा हूं? क्या सामग्री-प्रकार के साथ समस्याएं हैं क्योंकि यह वर्तमान में है (टेक्स्ट/एचटीएमएल)?

यदि मैं इस दृष्टिकोण का उपयोग करता हूं तो यह व्यावसायिक आवश्यकताओं को हल करता है।

संपादित

मैंने पाया कि मैं एक httpResult लौट सकते हैं के रूप में:

return new HttpResult(
     new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml"); 

जो सही सामग्री प्रकार देता है।

तो, क्या यह सही तरीका है या अगर मैं इस मार्ग से नीचे जाऊं तो क्या मुझे समस्याएं होंगी?

उत्तर

17

हाँ IHttpResult लौटने पर आपको सटीक पेलोड, सामग्री-प्रकार और अन्य HTTP शीर्षलेखों को नियंत्रित करने की अनुमति मिल जाएगी।

इसके अलावा आप एक स्ट्रीम लौटने तक सीमित नहीं हैं, यानी आप एक अलग सामग्री-प्रकार के साथ एक XML स्ट्रिंग को वापस करने के लिए HttpResult का उपयोग कर सकते हैं।

यहाँ बेहतर दर्शाते हैं कि क्या ServiceStack वापसी प्रकार के साथ संभव है कुछ लिंक कर रहे हैं:

तुम भी एक स्थिर फ़ाइल लौट सकते हैं एक FileInfo का उपयोग कर वस्तु, एक वैकल्पिक पैरामीटर के साथ एक अनुलग्नक जो फाइल डाउनलोड करने के लिए संकेत के बजाय साथ ब्राउज़र में देखने का प्रयास करेंगे के रूप में फ़ाइल वापस जाने के लिए:

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true); 
+0

मदद के लिए धन्यवाद। –

+0

क्या स्ट्रीम के बजाए स्ट्रिंग लौटने में कोई फायदा होगा? –

+2

नहीं, दोनों सीधे एएसपी.नेट के एचटीपी रेस्पॉन्स आउटपुटस्ट्रीम पर लिखे जाते हैं। इसलिए मेमोरीस्ट्रीम का उपयोग करना (यदि आपके पास पहले से मेमोरी में स्ट्रिंग है) अतिरिक्त ओवरहेड जोड़ता है। जब आप आउटपुट स्ट्रीम करना चाहते हैं तो एक स्ट्रिंग को वापस करना समझदारी है (यानी स्मृति में पूरी प्रतिक्रिया लोड करने से बचें) – mythz

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