该[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]属性对动作参数的默认数据源应用推理规则。这些规则使您不必通过将属性应用于操作参数来手动识别绑定源。绑定源推理规则的行为如下:
本文链接:https://blog.nnwk.net/article/62
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论