首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义InputFormatter在ASP.NET Core2.0中被忽略

自定义InputFormatter在ASP.NET Core2.0中被忽略
EN

Stack Overflow用户
提问于 2017-10-30 23:03:49
回答 2查看 3.1K关注 0票数 3

我需要构建一个XMLCore2.0WebAPI应用程序,它能够完成定制的ASP.NET输入和输出格式设置。

我已经成功地设置了自定义输出格式化程序,而不是自定义输入格式化程序。

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

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
public class SoapInputFormatter : InputFormatter
{
    public override Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
    {
        throw new NotImplementedException();
    }

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

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

代码语言:javascript
复制
[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)
    {
    }
}

(经典的新web应用程序控制器)

我正在做Postman应用程序的帖子。没有一个帖子会击中SoapInputFormatter

有什么建议吗?有什么主意吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-10 22:24:35

也有同样的问题,然后找到了这个链接:

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

这基本上可以归结为文章中的以下内容:

  • 默认情况下,并不是每个绑定源都会被选中。有些模型绑定要求您专门启用绑定源。例如,当从主体绑定时,您需要将FromBody添加到您的模型/操作参数中,否则将不会使用BodyModelBinder。
  • 特别是,用户必须专门启用标头、正文和文件绑定源,并将使用特定的模型绑定。

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

-Rick

票数 7
EN

Stack Overflow用户

发布于 2018-10-30 12:37:44

I‘我有点晚了,但您需要使用[ApiController]才能使用InputFormatter。

按要求编辑:

代码语言:javascript
复制
[ApiController]
[Route("api/[controller]")]
public class ValuesController : Controller
{
  // GET api/values
  [HttpGet]
  public IEnumerable<string> Get()
  {
      return new string[] { "value1", "value2" };
  }
}
....
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47025515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档