c# - Postsharp DTO 请求验证和控制器范围的验证异常处理
问题描述
我正在尝试将 PostSharp 用于 WebAPI 项目。我无法完成这项任务。我想使用 PostSharp 合同来验证传入的 DTO 并在出现验证错误时集中异常处理。但我不知道如何在类级别应用异常方面,更糟糕的是如何在发生这种情况时返回 JSON 错误响应。
解决方案
没有代码示例有点不清楚您要使用 PostSharp 做什么。您似乎正在 ASP.NET Core (.NET 5) 中寻找一些典型的模型验证并返回自定义 JSON 响应(假设您正在使用 ASP.NET Web API)。
我知道您在询问 PostSharp,但我相信它需要一些自定义代码才能使其工作并在 ASP.NET 中返回自定义响应,而您可以通过 DataAnnotations 命名空间中的 ASP 本身免费获得其中的大部分内容。
例子:
// CredentialsRequest.cs
using System.ComponentModel.DataAnnotations;
public class Credentials
{
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
public string Password { get; set; }
}
// AuthenticationController.cs
[ApiController]
public class AuthenticationController : ControllerBase
{
[HttpPost]
public Task<IActionResult> Login([FromBody] Credentials credentials)
{
var result = // check `credentials` for valid login
return result.Success
? Ok(result)
: StatusCode(StatusCodes.Status401Unauthorized, result);
}
}
要捕获所有模型验证错误,您可以添加以下响应工厂Startup.ConfigureServices
(根据自己的喜好自定义):
services.Configure<ApiBehaviorOptions>(config =>
{
// Override default response when input model is invalid
config.InvalidModelStateResponseFactory =
ctx => new BadRequestObjectResult(new BaseResponse(
success: ctx.ModelState.IsValid,
errors: ctx.ModelState.Values
.Where(v => v.ValidationState == ModelValidationState.Invalid)
.SelectMany(v => v.Errors)
.Select(e => new ErrorDetails
{
Code = "ModelError",
Description = e.ErrorMessage
})
.ToList()
));
});
这里只是一些简单BaseResponse
的ErrorDetails
数据模型/类,我用作所有响应数据模型的基础:
public class BaseResponse
{
public bool Success { get; }
public List<ErrorDetails> Errors { get; }
public BaseResponse(bool success, ErrorDetails error)
: this(success, new List<ErrorDetails> { error })
{ }
public BaseResponse(bool success, List<ErrorDetails> errors = null)
{
Success = success;
Errors = errors;
}
}
如果您尚未将 API 配置为以不同格式返回数据,则默认情况下应为 JSON。
推荐阅读
- reactjs - Mapbox 和 CSS Grid - Mapbox 不会在调整窗口大小时自动扩展
- typescript - WebStorm“eslint --fix on save”功能不起作用。但在终端 ESLint 运行良好
- c# - 使用 AzukeKeyVault 密钥签署 JWT
- c++ - 为非标准相机实现 Qt 相机插件
- python - django-background-task 执行完成后如何释放内存资源?
- java - 如何阻止一个微服务消费消息队列中的消息-RabbitMQ
- npm - SyntaxError:尝试将所有 .js 文件的扩展名更改为 .ts 时意外导入令牌
- testing - DBT中的暴露
- r - 使用 tidyverse 更广泛地旋转
- python - 从 pd.read_sql 丢失的数据