c# - 在验证上下文中使用 HttpRequest

标签 c# validation asp.net-core .net-core httpcontext

在 .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/

相关文章:

c# - 在 Application Insights 中查找 IdentityServer4 错误

c# - .NET WinForms - 如何监听系统注销、用户锁定、休眠启动和系统恢复的事件?

C# 获取模糊的 Active Directory 属性

c# - 服务类应该引用其他服务类还是只引用其他存储库类?

c# - 在 C# 中遍历泛型列表

c# - 使用 Json.Net 时,无法从字符串正确反序列化异常

java - Spring Data REST(使用 Spring Boot)- Hibernate 验证本地化

php - 验证部分表单 yii2

java - Micronaut 多级 bean 验证

.net - 在新的 ASP.NET Core 托管站点上,为什么将 ASPNETCORE_ENVIRONMENT 更改为任何自定义值会导致本地托管失败,但没有错误?