2012-05-03 13 views
12

मुझे नई वेबपी के साथ एक चाल याद आ रही है - मैं एक पोस्ट अनुरोध के माध्यम से एक एक्सएमएल स्ट्रिंग जमा करने की कोशिश कर रहा हूं और बहुत भाग्य नहीं ले रहा हूं।एएसपी.नेट एमवीसी 4 वेबएपीआई और पोस्टिंग एक्सएमएल डेटा

सामने अंत इस तरह jQuery उपयोग कर रहा है:

$(document = function() { 
    $("#buttonTestAPI").click(function() { 

     var d = " <customer><customer_id>1234</customer_id></customer>"; 
     $.ajax({ 
      type: 'POST', 
      contentType: "text/xml", 
      url: "@Url.Content("~/api/Customer/")", 
      data: d, 
      success: function (result) { 
       var str = result; 
       $("#output").html(str); 
      } 
     }); 
    }); 
}); 

मेरे नियंत्रक पल में बहुत सरल है - बस पोस्ट क्रिया के लिए डिफ़ॉल्ट - वापस जाने के लिए क्या में पारित किया गया था की कोशिश कर रहा:

public string Post(string value) 
    { 
     return value; 
    } 

हालांकि, "मान" बार-बार शून्य है। मैं और अधिक पर कैसे पहुँच सकते हैं

d = "<customer_id>1234</customer_id>"; 

तो मैं के रूप में 1234.

"मूल्य" मेरी नियंत्रक में मिलता है: अजीब बात है जब मैं jQuery में अपने डेटा को बदलने कुछ इस तरह हो सकता है, है मेरे नियंत्रक में जटिल xml स्ट्रिंग?

उत्तर

13

आप सामग्री प्रकार text/xml भेज रहे हैं लेकिन आपने अपना पैरामीटर string के रूप में परिभाषित किया है। आदर्श रूप से आपके एक्सएमएल को वर्ग पर मैप किया जाना चाहिए ताकि यह deserialised हो।

तो यदि आपको कच्चे xml की आवश्यकता है तो यह अभी तक समर्थित नहीं है। वर्तमान में वेब एपीआई धारावाहिक मीडियाटाइपफॉर्मेटर्स के लिए तैयार है और सरल प्रकार के प्रारूपण गायब हैं लेकिन वे आसानी से निर्मित कर सकते हैं।

यह एक है एक न्यूनतम ऐसे फ़ॉर्मेटर के कार्यान्वयन केवल अपने मामले में पढ़ सकते हैं और बीटा संस्थापक के आधार पर समर्थन (और नहीं हर रात को स्रोत कोड के बाद से यह काफी हद तक बदल गया है):

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

    protected override bool CanReadType(Type type) 
    { 
     return type == typeof (string); 
    } 

    protected override System.Threading.Tasks.Task<object> OnReadFromStreamAsync(Type type, Stream stream, 
     HttpContentHeaders contentHeaders, 
     FormatterContext formatterContext) 
    { 
     var taskCompletionSource = new TaskCompletionSource<object>(); 
     try 
     { 
      var memoryStream = new MemoryStream(); 
      stream.CopyTo(memoryStream); 
      var s = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray()); 
      taskCompletionSource.SetResult(s); 
     } 
     catch (Exception e) 
     { 
      taskCompletionSource.SetException(e);   
     } 
     return taskCompletionSource.Task; 
    } 
} 

और करने के लिए इसका इस्तेमाल, बस formatters संग्रह में जोड़ना:

GlobalConfiguration.Configuration.Formatters.Insert(0, new TextMediaTypeFormatter()); 
+0

आप '' 'var reader = new StreamReader (readStream) के साथ स्ट्रीम पढ़ने को सरल बना सकते हैं; var text = पाठक का इंतजार करें। ReadToEndAsync();' '' –

6

किसी को भी एक अद्यतन करने के लिए बीटा रिलीज से ऊपर Aliostad के जवाब के संस्करण की तलाश में एएसपीनेट एमवीसी 4 वेब एपीआई का आरसी (मामूली परिवर्तन के परिणामस्वरूप मेरे लिए थोड़ा सा काम किया गया)।

public void PostRawXMLMessage(HttpRequestMessage request) 
{ 
    var xmlDoc = new XmlDocument(); 
    xmlDoc.Load(request.Content.ReadAsStreamAsync().Result); 
} 

आप डिबग और शरीर, हेडर, आदि का निरीक्षण किया और देखेंगे कर सकते हैं:

public class TextMediaTypeFormatter : MediaTypeFormatter 
{ 

    public TextMediaTypeFormatter() 
    { 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript")); 
    } 

    public override bool CanReadType(Type type) 
    { 
     if (type == typeof(String)) 
      return true; 
     else 
      return false; 
    } 

    public override bool CanWriteType(Type type) 
    { 
     if (type == typeof(String)) 
      return true; 
     else 
      return false; 

    } 

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, System.Net.Http.HttpContent content, IFormatterLogger formatterLogger) 
    { 
     var taskCompletionSource = new TaskCompletionSource<object>(); 
     try 
     { 
      var memoryStream = new MemoryStream(); 
      readStream.CopyTo(memoryStream); 
      var s = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray()); 
      taskCompletionSource.SetResult(s); 
     } 
     catch (Exception e) 
     { 
      taskCompletionSource.SetException(e); 
     } 
     return taskCompletionSource.Task; 
    } 
} 
+0

क्या मैं चैट में आपसे बात कर सकता हूं? – medBo

18

निम्नलिखित आप एक वेब एपीआई पद्धति के लिए एक पोस्ट के माध्यम से एक कच्चे XML संदेश को पढ़ने के लिए अनुमति देगा कच्चे एक्सएमएल पोस्ट किया गया। मैंने HTTP पोस्ट करने के लिए फिडलर के संगीतकार का उपयोग किया और यह अच्छी तरह से काम करता है।

+0

बिल्कुल वही जो मैं खोज रहा था! बहुत बहुत धन्यवाद !!! – MissRaphie

0

मेरे लिए क्या समस्या हल हो जाती इस जोड़ने था:

static SubscriberController() 
{ 
    //Needed for xml deserialization to work 
    var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; 
    xml.UseXmlSerializer = true; 
} 

(SubscriberController मेरी कक्षा जो ApiController फैली हुई है, और इसके बाद के संस्करण एक स्थिर निर्माता है, तो यह एक बार चलेंगे)।

सुनिश्चित नहीं हैं कि अगर यह भी आवश्यक है, लेकिन मैं इतना की तरह मेरे पैरामीटर के लिए [FromBody] विशेषता को जोड़,:

public async Task<HttpResponseMessage> SynchronizeImax([FromBody] SynchronizeRequest synchronizeRequest) 
{ 
    //... 
} 

इस तरह से यह कर के बारे में महान बात यह है कि आप मूल दोनों XML और JSON इनपुट संभाल कर सकते हैं ।

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