将XML发布到WebAPI - 参数远离空

时间:2016-12-08 11:43:44

标签: asp.net-web-api asp.net-core

我正在尝试将XML发布到动作方法。该参数始终为null。有谁知道我做错了什么?

控制器类:

namespace TestNetCore.Controllers
{
    [Route("api/[controller]")]
    public class BookController : Controller
    {
        [HttpPost]
        public Book AddBook([FromBody]Book b) <-- b is always null
        {
            return new Book
            {
                Id = b.Id,
                Title = b.Title
            };
        }
    }
}

Startup.cs:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddXmlDataContractSerializerFormatters()
            .AddMvcOptions(opts =>
            {
                opts.RespectBrowserAcceptHeader = true;
                opts.ReturnHttpNotAcceptable = true;
            });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseStaticFiles();
        app.UseStatusCodePages();
        app.UseDeveloperExceptionPage();
        app.UseMvcWithDefaultRoute();
    }
}

在project.json中我添加了这个:

"Microsoft.AspNetCore.Mvc.Formatters.Xml": "1.0.1"

模型类:

namespace TestNetCore.Models
{
    [DataContract]
    public class Book
    {
        [DataMember(Order = 1)]
        public string Id { get; set; }
        [DataMember(Order = 2)]
        public string Title { get; set; }
    }
}

发送XML的脚本:

$(document).ready(function () {
    $("form").submit(function (e) {
        e.preventDefault();
        $.ajax({
            url: "api/book",
            dataType: "xml",
            contentType: "application/xml; charset=utf-8",
            method: "POST",
            data: { b: "<Book xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/TestNetCore.Models\"><Id>1</Id><Title>Programming Book</Title></Book>" },
            success: function (book) {
                addBook(book);
            },
            error: function (jqXHR) {
                alert(jqXHR.responseText);
            }
        })
    });
});

function addBook(book) {
    $("table tbody").append("<tr><td>" + book.id + "</td><td>" + book.title + "</td></tr>");
}

1 个答案:

答案 0 :(得分:0)

您的javascript是问题所在,您发送的对象包含名为b的属性,该属性包含字符串(xml内容),并且这与使用期望和对象Book及其操作的操作合同不匹配属性:

data: { b: "<Book xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/TestNetCore.Models\"><Id>1</Id><Title>Programming Book</Title></Book>" },