【发布时间】:2021-07-02 13:40:57
【问题描述】:
我正在开发一个使用 Owin 和 Autofac 作为 IOC 容器的 ASP.NET WebApi2 (.NET 4.7.2)。 Dtos 应在到达控制器之前使用 FluentValidation 进行验证。这是我的项目配置:
public class Startup
{
public void Configuration(IAppBuilder app)
{
...
var config = new HttpConfiguration();
config.Filters.Add(new ValidateDtoStateFilter());
...
FluentValidationModelValidatorProvider.Configure(config);
...
}
}
验证 dto 状态过滤器:
public class ValidateDtoStateFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (!actionContext.ModelState.IsValid)
{
throw new ValidationException(actionContext.ModelState
.SelectMany(ms => ms.Value.Errors
.Select(er => new ValidationFailure(ms.Key.Split('.')[1].FromPascalToCamelCase(), er.ErrorMessage))));
}
}
}
Autofac 构建器配置:
builder.RegisterAssemblyTypes(typeof(MyDtoValidator).Assembly)
.Where(t => t.Name.EndsWith("Validator"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
builder.RegisterType<FluentValidationModelValidatorProvider>().As<ModelValidatorProvider>();
builder.RegisterType<AutofacValidatorFactory>().As<IValidatorFactory>().SingleInstance();
Autofac 验证器工厂:
public class AutofacValidatorFactory : ValidatorFactoryBase
{
private readonly IComponentContext _context;
public AutofacValidatorFactory(IComponentContext context)
{
_context = context;
}
public override IValidator CreateInstance(Type validatorType)
{
object instance;
return _context.TryResolve(validatorType, out instance) ? instance as IValidator : null;
}
}
它适用于 POST 或 PUT 端点,其中 dto 来自 requets 有效负载中的[FromBody]。它确实不与[FromUri] dtos 一起工作,例如在 GET 请求中。验证器将由 Autofac 创建,但在 ValidateDtoStateFilter 的 OnActionExecuting 中,actionContext.ModelState 始终为 true,无论提供的数据是否有效。
我怎样才能使[FromUri] dtos 也得到 FluentValidation 中间件的验证?
更新
如果我没有进行任何更改,问题就不会再发生了。
【问题讨论】:
标签: c# asp.net-web-api2 owin autofac fluentvalidation