3

我的 asp.net web api 中的 post action 参数总是为空值。

这是我的行动。

[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;
        }

这就是我试图调用我的api的方式。

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;

我看过很多和我类似的帖子。但我无法解决我的问题。请给我提意见。

谢谢,纳雷什

4

3 回答 3

1

您是否指定 Web API 以使用 XmlSerializer?默认情况下,它使用 DataContractSerializer 来绑定 XML 请求。

于 2013-07-31T14:04:26.027 回答
0

参数的名称是 Id 可能是,控制器绑定器在请求的正文中寻找一个名为 Id 的值。

尝试将参数重命名为products

public HttpResponseMessage Add([FromBody]Products products)

于 2013-07-31T14:45:01.340 回答
0

这可能是由于您设置为 x-www-form-urlecoded 的 Content-Type,它期望 body 像

name=value&name=value

尝试像这样将内容类型设置为 xml 并尝试。

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

于 2013-07-31T12:24:01.370 回答