2012-06-21 12 views
23

भेजते समय AspNet WebApi POST पैरामीटर शून्य है, मूल रूप से बीटा बिट्स का उपयोग करके एक वेब एपीआई सेवा है जिसे मैंने रिलीज़ उम्मीदवार बिट्स का उपयोग करके पुनर्निर्मित किया है और अब मुझे यह समस्या है।एक्सपी

मेरे पास एक पोस्ट कार्रवाई है जो एकमात्र पैरामीटर के रूप में जटिल विकल्प लेती है। जब मैं जेसन प्रारूप में शरीर के साथ अनुरोध भेजता हूं तो ऑब्जेक्ट अपेक्षित के रूप में deserialised है, लेकिन अगर मैं एक्सएमएल भेजता हूं तो पैरामीटर शून्य है।

बीटा मैं मॉडल कार्लोस Figueira के ब्लॉग पोस्ट Disabling model binding on ASP.NET Web APIs Beta

आर सी लेकिन वे IRequestContentReadPolicy है कि इस विधि को लागू किया गया था निकाल दिया है में में वर्णित के रूप बंधन को अक्षम करके इस के आसपास काम किया है।

मेरे कार्रवाई:

public List<Models.Payload> Post([FromBody]Models.AimiRequest requestValues) 
{ 
    try 
    { 
    if (requestValues == null) 
    { 
     var errorResponse = new HttpResponseMessage(); 
     errorResponse.StatusCode = HttpStatusCode.NotFound; 
     errorResponse.Content = new StringContent("parameter 'request' is null"); 
     throw new HttpResponseException(errorResponse); 
    } 
    var metadataParams = new List<KeyValuePair<string, string>>(); 
    foreach (Models.MetadataQueryParameter param in requestValues.Metadata) 
    { 
     metadataParams.Add(new KeyValuePair<string, string>(param.Name, param.Value)); 
    } 
    List<Core.Data.Payload> data = _payloadService.FindPayloads(metadataParams, requestValues.ContentType, requestValues.RuleTypes); 
    var retVal = AutoMapper.Mapper.Map<List<Core.Data.Payload>, List<Models.Payload>>(data); 
    return retVal; // new HttpResponseMessage<List<Models.Payload>>(retVal); 
    } 
    catch (System.Exception ex) 
    { 
    _logger.RaiseError(ex); 
    throw; 
    } 
} 

मेरे मॉडल:

public class AimiRequest 
{ 
    public MetadataQueryParameter[] Metadata { get; set; } 
    public string ContentType { get; set; } 
    public string RuleTypes { get; set; } 
} 

public class MetadataQueryParameter 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

मैं सेवा के लिए अनुरोध भेजने के लिए फ़िडलर का उपयोग कर परीक्षण कर रहा हूँ।

यह काम करता है और मुझे अपेक्षित परिणाम देता है।

POST http://localhost:51657/api/search HTTP/1.1 
User-Agent: Fiddler 
Content-Type: application/json; charset=utf-8 
Accept: application/json 
Host: localhost:51657 
Content-Length: 219 

{ 
    "ContentType":null, 
    "RuleTypes":null, 
    "Metadata":[ 
    { 
    "Name":"ClientName", 
    "Value":"Client One" 
    }, 
    { 
    "Name":"ClientName", 
    "Value":"Client Two" 
    } 
    ] 
} 

यह विफल रहता है क्योंकि requestValues ​​पैरामीटर अशक्त

POST http://localhost:51657/api/search HTTP/1.1 
User-Agent: Fiddler 
Content-Type: application/xml; charset=utf-8 
Accept: application/xml 
Host: localhost:51657 
Content-Length: 213 

<AimiRequest> 
    <ContentType /> 
    <RuleTypes /> 
    <Metadata> 
    <MetadataQueryParameter> 
     <Name>ClientName</Name> 
     <Value>Client One</Value> 
    </MetadataQueryParameter> 
    <MetadataQueryParameter> 
     <Name>ClientName</Name> 
     <Value>Client Two</Value> 
    </MetadataQueryParameter> 
    </Metadata> 
</AimiRequest> 
+0

में इस [सवाल] विवरण देखें [1] ... [1]: http://stackoverflow.com/प्रश्न/14068288/मॉडल-हमेशा-नल-ऑन-एक्सएमएल-पोस्ट – barrypicker

उत्तर

24

अपने Global.asax.cs में ApplicationStart() विधि को निम्नलिखित लाइनों को जोड़ कर, अपने मूल एक्सएमएल अनुरोध काम करना चाहिए:

+०१२३५१६४१०६१
var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; 
xml.UseXmlSerializer = true; 

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

XmlSerializer मेरे लिए अधिक सुचारू रूप से काम करता प्रतीत होता है, क्योंकि मुझे प्रत्येक XML अनुरोध में मॉडल का नामस्थान जोड़ने की आवश्यकता नहीं है।

एक बार फिर, मैं माइक वास्सन के लेख में मेरी जानकारी मिली: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#xml_media_type_formatter

+0

यह वह समाधान था जिसे मैं ढूंढ रहा था।मुझे वही समस्या थी जहां जेसन ठीक काम करेगा, लेकिन एक्सएमएल –

+0

का उपयोग करते समय ऑब्जेक्ट हमेशा शून्य हो जाएगा। अब ऐप लौट रहा है "अनुरोध इकाई के मीडिया प्रकार 'एप्लिकेशन/एक्सएमएल' इस संसाधन के लिए समर्थित नहीं है।" – gkon

5

मैं आप के रूप में एक ही समस्या हो रही थी है, और के रूप में यहाँ वर्णित XmlMediaTypeFormatter का उपयोग कर वस्तु serializing से समाधान नहीं मिला: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#testing_object_serialization। मैंने लेख के निचले हिस्से में "परीक्षण ऑब्जेक्ट सीरियलाइजेशन" अनुभाग में कोड का उपयोग किया, और अपने मॉडल ऑब्जेक्ट को मेरे मॉडल के साथ बदल दिया।

जब मैं अपने वस्तु धारावाहिक, मैंने देखा कि निम्न विशेषताओं को रूट नोड किया गया था:

xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://schemas.datacontract.org/2004/07/NAMESPACE.OF.YOUR.MODEL" 

तुम इतनी तरह अपने xml करने के लिए इन विशेषताओं को जोड़ने, तो अपने नियंत्रक सही ढंग से क्रमानुसार चाहिए requestValues ​​वस्तु:

<AimiRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.datacontract.org/2004/07/NAMESPACE.OF.YOUR.MODEL"> 
    <ContentType /> 
    <RuleTypes /> 
    <Metadata> 
    <MetadataQueryParameter> 
     <Name>ClientName</Name> 
     <Value>Client One</Value> 
    </MetadataQueryParameter> 
    <MetadataQueryParameter> 
     <Name>ClientName</Name> 
     <Value>Client Two</Value> 
    </MetadataQueryParameter> 
    </Metadata> 
</AimiRequest> 
संबंधित मुद्दे