将XML发布到asp.net Core 2.0 Web API

Lie*_*ero 5 xml ajax asp.net-core asp.net-core-webapi asp.net-core-2.0

我正在尝试将XML发布到asp.net核心2:

$.ajax({
    type: "POST",
    url: 'api/Test',
    data: "<test>hello<test>",
    contentType: "application/xml",
    success: function (response) { alert(response); },
});
Run Code Online (Sandbox Code Playgroud)

我应该如何编写动作,使其接受xml作为参数?

  • IActionResult Post([FromBody]string xml) -> xml为空
  • IActionResult Post([FromBody]XElement xml) -> xml为空
  • IActionResult Post(XElement xml)-> InvalidOperationException:无法创建类型为'System.Xml.Linq.XElement'的实例。模型绑定的复杂类型不能为抽象或值类型,并且必须具有无参数构造函数。
  • IActionResult Post(string xml) -> xml为空

在Startup.ConfigureServices中:

services.AddMvc()
    .AddXmlSerializerFormatters();
Run Code Online (Sandbox Code Playgroud)

如何编写控制器以使其接受XML作为参数?我知道我可以从HttpContext.Request中读取它,但是我希望它可以作为参数

Lie*_*ero 5

我最终创建了自定义 InputFormatter,这非常简单,但如果有更好的选择,欢迎您写下答案!

public class XDocumentInputFormatter : InputFormatter, IInputFormatter, IApiRequestFormatMetadataProvider
{
    public XDocumentInputFormatter()
    {
        SupportedMediaTypes.Add("application/xml");
    }

    protected override bool CanReadType(Type type)
    {
        if (type.IsAssignableFrom(typeof(XDocument))) return true;
        return base.CanReadType(type);
    }

    public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
    {
        var xmlDoc = await XDocument.LoadAsync(context.HttpContext.Request.Body, LoadOptions.None, CancellationToken.None);
        return InputFormatterResult.Success(xmlDoc);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 startup.cs 中注册 XDocumentInputFormatter

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => options.InputFormatters.Insert(0, new XDocumentInputFormatter()));
}
Run Code Online (Sandbox Code Playgroud)