2

我对 .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 适用于任何控制器和指定的路由。有没有办法只为指定的控制器/路由应用格式化程序。

4

2 回答 2

0

将您的 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 和具有自定义属性的参数。希望能帮助到你。

于 2020-06-25T08:16:26.600 回答
-3

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

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

注意:顺序很重要。

于 2019-03-01T12:28:49.120 回答