该[ApiController]属性可以应用于控制器类以启用以下自以为是的、特定于 API 的行为:
该[ApiController]属性可以应用于特定的控制器,如项目模板中的以下示例所示:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase在多个控制器上使用该属性的一种方法是创建一个使用该[ApiController]属性注释的自定义基本控制器类。以下示例显示了一个自定义基类和一个从它派生的控制器:
[ApiController]
public class MyControllerBase : ControllerBase
{
}
[Produces(MediaTypeNames.Application.Json)]
[Route("[controller]")]
public class PetsController : MyControllerBase该[ApiController]属性可以应用于程序集。当[ApiController]属性应用于程序集时,程序集中的所有控制器都[ApiController]应用了该属性。无法选择退出单个控制器。将程序集级属性应用于Program.cs文件:
using Microsoft.AspNetCore.Mvc;
[assembly: ApiController]
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();属性使[ApiController]属性路由成为一项要求。例如:
C#复制
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
无法通过UseMvc或UseMvcWithDefaultRoute定义的常规路由访问操作。UseEndpoints
该[ApiController]属性使模型验证错误自动触发 HTTP 400 响应。因此,动作方法中不需要以下代码:
if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}
ASP.NET Core MVC 使用ModelStateInvalidFilter操作筛选器来执行上述检查。
以下请求正文是序列化类型的示例:
JSON复制
{
  "": [
    "A non-empty request body is required."
  ]
}
HTTP 400 响应的默认响应类型是ValidationProblemDetails。以下请求正文是序列化类型的示例:
JSON复制
{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|7fb5e16a-4c8f23bbfc974667.",
  "errors": {
    "": [
      "A non-empty request body is required."
    ]
  }
}
ValidationProblemDetails类型:
要使自动响应和自定义响应保持一致,请调用ValidationProblem方法而不是BadRequest。ValidationProblem返回一个ValidationProblemDetails对象以及自动响应。
要记录自动 400 响应,请设置InvalidModelStateResponseFactory委托属性以执行自定义处理。默认情况下,InvalidModelStateResponseFactory使用ProblemDetailsFactory创建ValidationProblemDetails的实例。
以下示例显示如何检索ILogger<TCategoryName>的实例以记录有关自动 400 响应的信息:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
      // To preserve the default behavior, capture the original delegate to call later.
        var builtInFactory = options.InvalidModelStateResponseFactory;
        options.InvalidModelStateResponseFactory = context =>
        {
            var logger = context.HttpContext.RequestServices
                                .GetRequiredService<ILogger<Program>>();
            // Perform logging here.
            // ...
            // Invoke the default behavior, which produces a ValidationProblemDetails
            // response.
            // To produce a custom response, return a different implementation of 
            // IActionResult instead.
            return builtInFactory(context);
        };
    });
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();要禁用自动 400 行为,请将SuppressModelStateInvalidFilter属性设置为true。添加以下突出显示的代码:
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressConsumesConstraintForFormFileParameters = true;
        options.SuppressInferBindingSourcesForParameters = true;
        options.SuppressModelStateInvalidFilter = true;
        options.SuppressMapClientErrors = true;
        options.ClientErrorMapping[StatusCodes.Status404NotFound].Link =
            "https://httpstatuses.com/404";
    });
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();绑定源属性定义了找到动作参数值的位置。存在以下绑定源属性:
| 属性 | 绑定源 | 
|---|---|
| [FromBody] | 请求正文 | 
| [FromForm] | 请求正文中的表单数据 | 
| [FromHeader] | 请求头 | 
| [FromQuery] | 请求查询字符串参数 | 
| [FromRoute] | 从当前请求路由数据 | 
| [FromServices] | 作为动作参数注入的请求服务 | 
警告
[FromRoute]当值可能包含%2f(即)时不要使用/。%2f不会逃到/. 如果[FromQuery]值可能包含%2f.
如果没有[ApiController]属性或绑定源属性(如[FromQuery]),ASP.NET Core 运行时会尝试使用复杂对象模型绑定器。复杂对象模型绑定器以定义的顺序从值提供者中提取数据。
该[ApiController]属性对动作参数的默认数据源应用推理规则。这些规则使您不必通过将属性应用于操作参数来手动识别绑定源。绑定源推理规则的行为如下:
友情链接:
全部评论