【问题标题】:Apply .NET Core MVC InputFormatter to controller将 .NET Core MVC InputFormatter 应用到控制器
【发布时间】: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 适用于任何控制器和指定的路由。 有什么方法可以将格式化程序仅应用于指定的控制器/路由。

【问题讨论】:

    标签: .net-core model-view-controller controller 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?}");
                  });
      

      注意:顺序很重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-25
        • 1970-01-01
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        相关资源
        最近更新 更多