You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确将IHttpContextAccessor传入验证类的构造方法

解决ValidationAttribute无法注入IHttpContextAccessor的问题

特性的构造函数参数必须是编译时常量,无法直接传入依赖注入容器中的服务(比如IHttpContextAccessor),这是你当前遇到问题的核心原因。我们可以通过ValidationContext在验证逻辑内部获取所需服务,调整后的实现如下:

修改后的PageValidation类

public class PageValidation : ValidationAttribute
{
    private readonly string _userKey;

    // 构造函数仅保留UserKey参数
    public PageValidation(string userKey)
    {
        _userKey = userKey;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // 从ValidationContext中获取IHttpContextAccessor实例
        var httpContextAccessor = validationContext.GetService<IHttpContextAccessor>();
        if (httpContextAccessor == null)
        {
            return new ValidationResult("无法获取HttpContext服务");
        }

        var context = httpContextAccessor.HttpContext;
        var activeUserString = context.Session.GetString("ActiveUserSession");
        if (string.IsNullOrEmpty(activeUserString))
        {
            return new ValidationResult("用户未登录");
        }

        var activeUser = JsonSerializer.Deserialize<UserModel>(activeUserString);
        if (activeUser == null)
        {
            return new ValidationResult("用户信息解析失败");
        }

        // 验证权限,返回对应结果而非抛出异常
        return activeUser.AuthCheck(_userKey) 
            ? ValidationResult.Success 
            : new ValidationResult("Erişim yetkiniz yok!");
    }
}

修改Action上的特性调用

[PageValidation("Company")]
public IActionResult CompanyAndDepartments(string ViewType)
{
    // 你的业务逻辑
}

关键说明

  • 避免在特性构造函数中注入服务:特性是在编译时初始化的,而依赖注入服务是运行时解析的,两者生命周期不兼容,必须通过ValidationContext.GetService在验证逻辑内部获取服务。
  • 替换异常为ValidationResult:直接抛出ApplicationException会导致服务器返回500错误,不符合验证特性的设计初衷。返回ValidationResult.Failure可以让框架正常处理验证错误,返回更友好的响应。
  • 必要的空值检查:增加对IHttpContextAccessor、Session字符串、反序列化结果的空值判断,提升代码健壮性。

内容的提问来源于stack exchange,提问作者Yunus Mert Çakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:40:56