2012-07-26 16 views
31

लौटने के लिए मैं अपनी वेब एपीआई विधि को एक्सएमएल ऑब्जेक्ट को कॉलिंग एप्लिकेशन पर वापस करने के लिए चाहता हूं। वर्तमान में यह सिर्फ एक स्ट्रिंग ऑब्जेक्ट के रूप में एक्सएमएल लौट रहा है। क्या यह कोई नहीं है? यदि ऐसा है तो आप वेबपै को विधि कैसे प्राप्त करते हैं कि यह XML प्रकार के ऑब्जेक्ट को वापस कर रहा है?वेबएपीआई एक्सएमएल

धन्यवाद

संपादित करें: प्राप्त विधि का एक उदाहरण:

[AcceptVerbs("GET")] 
public HttpResponseMessage Get(int tenantID, string dataType, string ActionName) 
{ 
    List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData 
      ("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList(); 
    string AllResults = ""; 
    for (int i = 0; i < SQLResult.Count - 1; i++) 
    { 
     AllResults += SQLResult[i]; 
    } 
    string sSyncData = "<?xml version=\"1.0\"?> " + AllResults; 
    HttpResponseMessage response = new HttpResponseMessage(); 
    response.Content = new StringContent(sSyncData); 
    return response;   
} 

इसकी एक सा hacky क्योंकि प्रोटोटाइप चरण में im अभी भी। जब मैं इसे करने योग्य साबित कर सकता हूं तो रिफैक्टर होगा।

उत्तर

28

यदि आप एक धारावाहिक वस्तु वापस करते हैं, तो वेबएपीआई आपके क्लाइंट द्वारा स्वीकार किए जाने वाले स्वीकृति शीर्षलेख के आधार पर स्वचालित रूप से JSON या XML भेज देगा।

यदि आप एक स्ट्रिंग वापस करते हैं, तो आपको एक स्ट्रिंग मिल जाएगी।

+0

हाय सब, डेटा वापस लौटने वाला डेटा गतिशील है। स्थिति ए इकाइयों की एक सूची लौट रहा है। स्थिति बी 2 या अधिक इकाइयों/वर्गों के संयोजन की एक सूची हो सकती है। यह गतिशील है, लेकिन एक्सएमएल लौटने में WebAPI को बेवकूफ बनाने की उम्मीद कर रहा im (यदि भी JSON प्रारूप लौट सकते हैं कि तुलना में शांत होगा, लेकिन एक्सएमएल प्राथमिक neccessity है) – Matt

+0

तो किसी तरह का एक उद्देश्य है कि डेटा आप चाहते हैं और बदले शामिल कर सकते हैं बनाने के उस। –

+2

सुनिश्चित करें कि आपने ऑब्जेक्ट पर [Serializable()] निर्दिष्ट किया है, मैंने शुरुआत में इसे याद किया था। –

14

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

यदि आप Fiddler का उपयोग कर अनुरोध करते हैं तो आप या तो जेसन या एक्सएमएल होने के लिए स्वीकृति शीर्षलेख निर्दिष्ट कर सकते हैं।

Accept: application/xml 

आप इस लेख देखना चाहते हो सकता है: बजाय इसे एक्सएमएल को परिवर्तित करने की

स्ट्रिंग के सरल वापसी सूची,: Content Negotiation in ASP.NET MVC4 Web API Beta – Part 1

संपादित करें: कोड के साथ अपने संपादित प्रश्न के आधार पर। फिडलर का उपयोग करके इसे आजमाएं।

public List<string> Get(int tenantID, string dataType, string ActionName) 
    { 
     List<string> SQLResult = MyWebSite_DataProvidor.DB.spReturnXMLData("SELECT * FROM vwContactListing FOR XML AUTO, ELEMENTS").ToList(); 
     return SQLResult; 
    } 
उदाहरण के लिए

अगर अपनी सूची की तरह है:

List<string> list = new List<string>(); 
list.Add("Test1"); 
list.Add("Test2"); 
list.Add("Test3"); 
return list; 

और आप Accept: application/xml निर्दिष्ट उत्पादन होगा: में:

<ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <string>Test1</string> 
    <string>Test2</string> 
    <string>Test3</string> 
</ArrayOfstring> 

और आपके द्वारा निर्दिष्ट करता है, तो 'आवेदन/json स्वीकार करें' अनुरोध तब आउटपुट होगा:

[ 
    "Test1", 
    "Test2", 
    "Test3" 
] 

तो ग्राहक को अनुकूलित xml भेजने की बजाय, सामग्री प्रकार का अनुरोध करने दें।

+0

तो वर्तमान में मैं कस्टम निर्माण कर रहा हूँ एपीआई में एक्सएमएल विधि को बहुत अधिक समेकित स्ट्रिंग के रूप में प्राप्त करता है और उस स्ट्रिंग को वापस करने से। तो इससे पहले कुछ और नहीं किया जाना चाहिए? – Matt

+0

पढ़ने टिप्पणी के पोस्ट – Matt

+0

@Raven voltagex लिए, आप अपने प्रश्न में अपने विधि हस्ताक्षर या संबंधित सी # कोड का हिस्सा पोस्ट करें सकता है संलग्न? – Habib

62

यदि आप नहीं चाहते हैं कि नियंत्रक रिटर्न ऑब्जेक्ट प्रकार का निर्णय ले, तो आपको अपना विधि वापसी प्रकार System.Net.Http.HttpResponseMessage के रूप में सेट करना चाहिए और XML को वापस करने के लिए नीचे दिए गए कोड का उपयोग करना चाहिए।

public HttpResponseMessage Authenticate() 
{ 
    //process the request 
    ......... 

    string XML="<note><body>Message content</body></note>"; 
    return new HttpResponseMessage() 
    { 
    Content = new StringContent(XML, Encoding.UTF8, "application/xml") 
    }; 
} 

यह हमेशा वेब एपीआई से एक्सएमएल वापस करने का सबसे तेज़ तरीका है।

+9

सभी अक्सर लोग स्मार्ट होने का जवाब देते हैं। मैं जवाब सरल होना चाहता हूं और समस्या को सीधे हाथ से संबोधित करना चाहता हूं। मैं एक्सएमएल के साथ स्ट्रिंग है। मैं एक्सएमएल वापस करना चाहता हूँ। बिंगो! इस उत्तर के लिए धन्यवाद। – Kevin

18

IHttpActionResult रिटर्न प्रकार के साथ संगत होने का एक और तरीका है।इस मामले में मैं डेटा अनुबंध serializer के बजाय एक्सएमएल Serializer (वैकल्पिक) का उपयोग करने के लिए यह पूछ रहा हूँ, मैं return ResponseMessage( तो उपयोग कर रहा हूँ कि मैं एक वापसी संगत IHttpActionResult साथ मिलती है:

return ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new ObjectContent<SomeType>(objectToSerialize, 
       new System.Net.Http.Formatting.XmlMediaTypeFormatter { 
        UseXmlSerializer = true 
       }) 
     }); 
+0

वही तरीका है जो मैं खोज रहा था। धन्यवाद AaronLS – Shahdat

+1

ग्रेट उत्तर, धन्यवाद। यकीन है कि 'SomeType' एक डिफ़ॉल्ट निर्माता है, या आप एक बेकार त्रुटि मिलती है बनाओ *" ... कॉन्फ़िगर किया गया फ़ॉर्मेटर 'System.Web.Http.Tracing.Tracers.XmlMediaTypeFormatterTracer' प्रकार का ऑब्जेक्ट नहीं लिख सकते हैं ... "* – Dunc

+2

आप कर सकते हैं बस 'सामग्री (System.Net.HttpStatusCode.OK, मॉडल, कॉन्फ़िगरेशन। Formatters.XmlFormatter) लिखें'। – kokosda

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