gpt4 book ai didi

c# - 从验证器覆盖 http 状态代码

转载 作者:太空狗 更新时间:2023-10-30 01:04:35 25 4
gpt4 key购买 nike

我有以下 DTO:

public class SomethingRequest {
public string Code { get; set; }
}

代码 必须是唯一的,所以我创建了一个验证器来检查是否已经存在带有所提供代码的记录,如下所示

public class SomethingValidator: AbstractValidator<SomethingRequest> 
{
public SomethingValidator(ISomethingRepository repo) {
RuleFor(something => something.Code).Must(BeUnique);
}

private bool BeUnique(string code) { ... uniqueness check... }
}

当我使用验证功能时,验证器会自动连接所有带有 SomethingRequest 的方法,这真的很棒。

当条件失败时,我想返回 409 Conflict HTTP 状态代码,但总是返回 400 Bad Request

所以,问题是:

  1. 我是否滥用了验证功能? (即 Autowiring 的验证器并非设计用于应用程序逻辑检查)
  2. 如果我不是,是否有任何方法可以覆盖验证器的 400 BadRequest 状态代码?

最佳答案

Am I misusing validation feature? (i.e. autowired validators were not designed to be used for application logic checks)

我想说这最好在远离验证的业务逻辑中完成,因为检查唯一性实际上是验证检查而不是验证,因为它需要检查数据源。 My answer on this question解决了类似的问题。

虽然您可以使用 ErrorResponseFilter 覆盖验证错误的响应状态代码,但我建议您为此业务逻辑创建您自己的请求过滤器,因为覆盖响应会使您的应用程序变得困惑再次增长,这并不是真正的验证。

在 ServiceStack 中使用过滤器属性很简单:

public class VerifySomethingCodeAttribute : Attribute, IHasRequestFilter
{
IHasRequestFilter IHasRequestFilter.Copy()
{
return this;
}

public int Priority { get { return int.MinValue; } }

public void RequestFilter(IRequest req, IResponse res, object requestDto)
{
SomethingRequest somethingRequestDto = requestDto as SomethingRequest;
if(somethingRequestDto == null)
return;

// Verify the code
// Replace with suitable logic
// If you need the database your wire it up from the IoC
// i.e. HostContext.TryResolve<IDbConnectionFactory>();
bool isUnique = ...

if(!isUnique)
throw HttpError.Conflict("This record already exists");
}
}

然后简单地注释DTO:

[VerifySomethingCode]
public class SomethingRequest {
public string Code { get; set; }
}

然后您可以确定 DTO 中的代码将被验证为唯一的,您可以返回任何您想要的状态和响应。过滤器可让您完全控制。

希望这对您有所帮助。

关于c# - 从验证器覆盖 http 状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22761797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com