在ASP.NET Core 2.0中忽略自定义InputFormatter

时间:2017-10-30 23:03:49

标签: c# asp.net-web-api asp.net-core asp.net-core-2.0 inputformatter

我需要构建一个ASP.NET Core 2.0 Web API应用程序,它可以完成自定义XML输入和输出格式化。

我一直在设置自定义输出格式化程序,但不是自定义输入格式化程序。

更确切地说,这是启动配置:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddMvc(opt =>
        {
            opt.ReturnHttpNotAcceptable = true;

            opt.OutputFormatters.Clear();
            opt.InputFormatters.Clear();
            opt.InputFormatters.Add(new SoapInputFormatter());
            opt.OutputFormatters.Add(new SoapOutputFormatter());
        });
}

我们的想法是拥有自定义SOAP输入和输出格式。不,现有的XmlDataContractSerializerInputFormatter不会这样做。

SoapOutputFormatter类:

public class SoapOutputFormatter : IOutputFormatter
{
    public bool CanWriteResult(OutputFormatterCanWriteContext context)
    {
        return true;
    }

    public async Task WriteAsync(OutputFormatterWriteContext context)
    {
        var bytes = Encoding.UTF8.GetBytes(context.Object.ToString());
        await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
    }
}

SoapInputFormatter类:

public class SoapInputFormatter : InputFormatter
{
    public override Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
    {
        throw new NotImplementedException();
    }

    protected override bool CanReadType(Type type)
    {
        return true;
    }
}

我设置断点只是为了获取调用的代码,以后我可以实际实现有用的代码。但SoapInputFormatter类根本没有被调用。控制器:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {

        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}

(经典的新网络API app控制器)

我正在使用Postman应用进行POST。没有POST会点击SoapInputFormatter

任何提示?有什么想法吗?

2 个答案:

答案 0 :(得分:3)

遇到同样的问题然后找到了这个链接:

http://www.dotnetcurry.com/aspnet-mvc/1368/aspnet-core-mvc-custom-model-binding

它基本上归结为文章中的这些项目:

  • 默认情况下不会检查每个绑定源。某些模型绑定器要求您专门启用绑定源。例如,从Body绑定时,需要将[FromBody]添加到模型/动作参数中,否则将不使用BodyModelBinder。
  • 特别是,Headers,Body和Files绑定源必须由用户专门启用,并将使用特定的模型绑定器

我在POST请求中添加了[FromBody],然后调用了我的自定义InputFormatter。

-Rick

答案 1 :(得分:0)

来晚了一点,但是您需要使用[ApiController]才能使用InputFormatter。

根据要求编辑:

[ApiController]
[Route("api/[controller]")]
public class ValuesController : Controller
{
  // GET api/values
  [HttpGet]
  public IEnumerable<string> Get()
  {
      return new string[] { "value1", "value2" };
  }
}
....