3

Я всегда получаю null значение для моего параметра после действия в asp.net web api.ASP.Net web api post действие param всегда приходит null

Это мое действие.

[System.Web.Mvc.HttpPost] 
     public HttpResponseMessage Add([FromBody]Products id) 
     { 

      var response = new HttpResponseMessage(); 
      try 
      { 
       if (id.ProductsList.Length > 0) 
       { 
        response.StatusCode = HttpStatusCode.OK; 
        response.EnsureSuccessStatusCode(); 
        response.Content = new StringContent(string.Format("Number of products {0}",id.ProductsList.Length)); 
        Logger.Info(string.Format("Number of products {0}", id.ProductsList.Length)); 
       } 
       response.StatusCode = HttpStatusCode.BadRequest; 
      } 
      catch (Exception ex) 
      { 
       response.StatusCode = HttpStatusCode.InternalServerError; 
       response.Content = new StringContent("Error occured"); 
       Logger.Error(ex); 
      } 
      return response; 
     } 

Вот как я пытаюсь вызвать свою апи.

var filePath = @"C:\Apps\Eastworks\Lott\boots.xml"; 
       var xmlDoc = new XmlDocument(); 
       xmlDoc.Load(filePath); 

       var client = new HttpClient(); 
       MediaTypeFormatter jsonFormatter = new XmlMediaTypeFormatter(); 

       HttpContent content = new ObjectContent<string>(xmlDoc.OuterXml, jsonFormatter); 
       if (content.Headers.Contains("Content-Type")) 
       { 
        content.Headers.Remove("Content-Type"); 
        content.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
       } 

       var result = client.PostAsync("http://localhost:3103/Products/Add", 
           content) 
        .Result; 

Ниже приводится моя модель.

[XmlRoot("products")] 
    public class Products 
    { 
     [XmlElement("product")] 
     public Product[] ProductsList { get; set; } 
    } 

    public class Product 
    { 
     public Product() 
     { 
      //default implementation 

     } 
     [XmlElement("code")] 
     public string Code { get; set; } 

     [XmlElement("related-product")] 
     public RelatedProduct[] RelatedProducts { get; set; } 


     [XmlElement("description")] 
     public string Description { get; set; } 

     // Removed some of the properties. 

     [XmlElement("variant")] 
     public Variant[] Variants { get; set; } 
    } 

И это мой xml.

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <product> 
    <code>mipacaloha</code> 
    <related-product>paisley_blk</related-product> 
    <related-product>mipacpolkadot</related-product> 

    <description>Classic MiPac silhouette. 30cm (12 inches) wide by 37cm (15 inches) high with a 15cm (6 inches) depth.</description> 
    <brand>Mi Pac</brand> 
    <style>Backpack</style> 
    <model-name>Pocket Prints</model-name> 
    <weight>0.4</weight> 
    <gender>womens</gender> 

    <variant> 
     <bag-details /> 
     <exact-colour>Aloha Sky blue</exact-colour> 
     <colour>Blue</colour> 
     <pic-url>005872</pic-url> 
     <sku>136200</sku> 
     <ean>5053466362002</ean> 
     <stock>0</stock> 
     <price>21.99</price> 
    </variant> 
    <variant> 
     <bag-details /> 
     <exact-colour>Aloha Purple</exact-colour> 
     <colour>Purple</colour> 
     <pic-url>mipacaloha</pic-url> 
     <sku>121521</sku> 
     <ean>5053466215216</ean> 
     <stock>6</stock> 
     <price>18.99</price> 
     <original-price>21.99</original-price> 
    </variant> 

    </product> 
</products> 

Я устанавливаю XmlSerializer для использования в Application_Start.

var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; 
      xml.UseXmlSerializer = true; 

Я видел много сообщений, похожих на мои. Но я не мог исправить свою проблему. Пожалуйста, посоветуй мне.

Спасибо, Naresh

+3

следующая строка всегда выполняется: 'response.StatusCode = HttpStatusCode.BadRequest;'. Кроме того, я не вижу причин вообще называть 'response.EnsureSuccessStatusCode();' на стороне сервера ... – Liel

+0

@Liel, спасибо за определение. Но на самом деле я получаю null reference exception, поскольку действие всегда принимает нулевое значение. – Naresh

ответ

1

Вы указать Web API использовать XmlSerializer? По умолчанию он использует DataContractSerializer для привязки XML-запросов.

+0

Я указал, что в моем приложении Application_Start. – Naresh

+1

Хорошо, я считаю, что ваш XML и модель не синхронизированы. Например, посмотрите на ''. Что вы можете сделать, так это построить объект модели и позволить веб-API сериализовать это для вас из метода действия GET и сравнить его с тем, что у вас есть в boots.xml. – Badri

+0

Я попытался десериализовать xml для объекта, используя XmlSerializer, который работал finr. Но, как вы предложили, дайте мне попробовать. Благодарю. – Naresh

0

Это может быть связано с Content-Type, вы настраиваете к х-WWW-форм-urlecoded, который ожидает тело, как

name=value&name=value

Попробуйте установить тип содержимого в xml, как это, и попробуйте.

content.Headers.Add("Content-Type", "application/xml");

+0

Спасибо за ваш ответ. Но я тоже это пробовал. Поскольку я использую XmlMediaTypeFormatter, он уже использует тип контента как «application/xml». – Naresh

0

Имя параметра: Id Возможно, связующее устройство контроллера запрашивает значение с именем Id в теле запроса.

Попробуйте переименовать параметр в products:

public HttpResponseMessage Add([FromBody]Products products)

+0

Не повезло. По-прежнему получает значение как null. Я использую правильный тип контента и кодировку? – Naresh

+0

Нет, см. Ответ @ Чандермани. Я не вижу причин касаться заголовков ... – Liel

Смежные вопросы