将 .NET Core MVC InputFormatter 应用到控制器

Posted

技术标签:

【中文标题】将 .NET Core MVC InputFormatter 应用到控制器【英文标题】:Apply .NET Core MVC InputFormatter to controller 【发布时间】:2019-01-29 16:02:49 【问题描述】:

我对 .NET Core 还是很陌生。我正在尝试设置一个小的 MVC 应用程序。我在哪里实现了一个带有定义路由的控制器。

[Route("api/ota")]
public class OTAController : ControllerBase

    [HttpPost]
    public async Task<ContentResult> EndPoint([FromBody] object otaHotelRatePlanNotifRQ)
    
        Console.WriteLine("Something is posted");
        ...

对于这个控制器,我实现了一个自定义 inputformatter 并在 Startup.cs 中注册它到目前为止工作正常。

        services.AddMvc(options => 
            options.InputFormatters.Insert(0, new RawRequestBodyInputFormatter());
        ).SetCompatibilityVersion(CompatibilityVersion.Version_2_1)

但是现在这个 inputformatter 适用于任何控制器和指定的路由。 有什么方法可以将格式化程序仅应用于指定的控制器/路由。

【问题讨论】:

【参考方案1】:

将您的 inputformatter 添加为第一个格式化程序 InputFormatters.Insert(0,new StringRawRequestBodyFormatter()) 然后在 CanRead 方法中的此格式化程序中检查正在绑定的参数是否具有您在 FromBody 旁边指定的自定义属性

 public override Boolean CanRead(InputFormatterContext context)
    
        if (context == null) 
            throw new ArgumentNullException(nameof(context));
        
        var contentType = context.HttpContext.Request.ContentType;
        if (supportedMimes.Contains(contentType) && 
            context.Metadata is DefaultModelMetadata mt &&
            mt.Attributes.ParameterAttributes.Any(a=>a.GetType().Equals(typeof(RawJsonAttribute))))
            return true;
        else
            return false;
    

控制器操作:public IActionResult BeginExportToFile([RawJson,FromBody] string expSvcConfigJsonStr)

因此,简单来说,此格式化程序将仅用于支持的 mime 和具有自定义属性的参数。 希望对您有所帮助。

【讨论】:

【参考方案2】:

是的,这可以通过在 config 方法中添加一个新路由在 Startup.cs 中,默认情况下你应该有这样的东西,你需要为你想要的控制器添加一个新的:

app.UseMvc(routes =>
            
                routes.MapRoute(
                    name: "default",
                    template: "controller=Home/action=Index/id?");
            );

注意:顺序很重要。

【讨论】:

以上是关于将 .NET Core MVC InputFormatter 应用到控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将项目引用添加到 ASP.NET Core 1.0 MVC 项目

将字符串数组发布到 .net-core mvc

Asp.net Core 如何将 ReflectionIT.Mvc.Paging 与 ViewModel 一起使用?

将 Azure B2C 与 MVC、.NET Core 3.1 结合使用

将模型传递给 ASP.NET Core MVC 中的视图

MVC模式与ASP.NET Core MVC