将 .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 项目
Asp.net Core 如何将 ReflectionIT.Mvc.Paging 与 ViewModel 一起使用?