在到达ASP.NET Core中的控制器之前拦截错误请求 - c#

如果收到的请求是BadRequest,我有一个逻辑可以应用,为此我创建了一个过滤器:

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            // Apply logic
        }
    }
}

在启动中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => { options.Filters.Add<ValidateModelAttribute>(); });
}

控制器:

[Route("api/[controller]")]
[ApiController]
public class VerifyController : ControllerBase
{
    [Route("test")]
    [HttpPost]
    [ValidateModel]
    public ActionResult<Guid> validationTest(PersonalInfo personalInfo)
    {
        return null;
    }
}

模型:

public class PersonalInfo
{
    public string FirstName { get; set; }
    [RegularExpression("\\d{4}-?\\d{2}-?\\d{2}", ErrorMessage = "Date must be properly formatted according to ISO 8601")]
    public string BirthDate { get; set; }
}

事情是当我在断点上放一个断点时:

if (!context.ModelState.IsValid)

仅当我发送的请求有效时,执行才会到达此行。如果我发送了错误的请求,为什么它没有通过过滤器?

参考方案

您要应用于控制器的[ApiController]属性将“自动HTTP 400响应”添加到MVC管道,这意味着如果ModelState无效,则不会执行自定义过滤器和操作。您可以选择几种方法来影响其工作方式:

1.删​​除[ApiController]属性

尽管您仅可以删除[ApiController]属性,但这也会导致其提供的某些其他功能(例如“绑定源参数推断”)丢失。

2.仅禁用自动HTTP 400响应

这是docs中的示例,显示了如何仅禁用此功能:

services.Configure<ApiBehaviorOptions>(options =>
{
    // ...
    options.SuppressModelStateInvalidFilter = true;
});

此代码位于StartupConfigureServices方法中。

3.定制生成的自动响应

如果只想向调用方提供自定义响应,则可以自定义返回的内容。我已经在另一个答案here中描述了它是如何工作的。

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET Core 2.1中添加自定义TagHelpers - c#

我严格按照ASP.NET Core文档进行操作,并花费了大量时间来拖曳堆栈溢出,试图实现简单的自定义TagHelper,但没有成功。任何人都可以就任何陷阱或已知错误提出建议吗?应用程序属性:AssemblyName: AmpWeb Target Framework .NET Core 2.1 NuGet软件包Microsoft.AspNetCore.All …

asp.net mvc或javascript将另一页的结果返回给方法 - c#

是否可以将另一个页面的结果返回给JavaScript方法或C#控制器操作?我有一个共享的复杂页面,该页面在我的网站上遍布使用,当前用于在C#后端的用户数据上设置单个变量。当用户完成共享的复杂页面后,我将返回引用页面。当用户在刷新或返回时将其作为url参数传递给返回的页面时,我返回的页面包含新选择的变量。我有一个新页面,我希望从我的共享复杂页面中返回该变量。但…