在 .net Framework <= 4.7.2 中,在验证上下文中,您可以获得当前的 HttpRequest
通过访问 HttpContext
.
例如,我有一段代码如下所示:
public sealed class AccessValidator : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext context)
{
// validate stuff, if all true -> yield ok.
// if is not valid
var request = HttpContext.Current.Request;
// store/log the request payload.
}
}
使用 .net Core 2.1 时无法做到这一点。
看到一篇关于注入(inject)
IHttpContextAccessor
的帖子什么的,但它几乎在每个地方都暴露了请求。由于这是我服务器的外部库,我希望它不依赖服务器代码注入(inject),因为它会产生我不想成为的依赖。
有没有已知的方法来处理这个或解决这个问题?
最佳答案
您可以通过 IHttpContextAccessor
的组合来实现此目的。和 ValidationContext.GetService
.这是它的样子:
protected override ValidationResult IsValid(object value, ValidationContext context)
{
// validate stuff, if all true -> yield ok.
// if is not valid
var httpContextAccessor = (IHttpContextAccessor)context.GetService(typeof(IHttpContextAccessor));
var request = httpContextAccessor.HttpContext.Request;
// store/log the request payload.
}
它不使用依赖注入(inject),而是使用服务定位器模式(considered an anti-pattern,但它可能是您唯一真正的选择)。
您还需要配置
IHttpContextAccessor
使用 Startup.ConfigureServices
中的 DI 容器, 像这样:services.AddHttpContextAccessor();
关于c# - 在验证上下文中使用 HttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52933663/