由于缺少合适的构造函数,aspnet core 2.1 操作过滤器出错 [英] Getting error with aspnet core 2.1 action filter due to missing suitable constructor

查看:18
本文介绍了由于缺少合适的构造函数,aspnet core 2.1 操作过滤器出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做了一个声明过滤器

公共类 ClaimRequirementAttribute : TypeFilterAttribute{public ClaimRequirementAttribute(string claimType, ClaimRoles claimValue) : base(typeof(ClaimRequirementFilter)){参数 = new object[] {new Claim(claimType, claimValue.ToString()) };}}公共类 ClaimRequirementFilter : IAuthorizationFilter{public void OnAuthorization(AuthorizationFilterContext context){var headers = context.HttpContext.Request.Headers;var tokenSuccess = headers.TryGetValue("Token", out var token);var emailSuccess = headers.TryGetValue("Email", out var email);var deviceNameSuccess = headers.TryGetValue("DeviceName", out var deviceName);if (tokenSuccess && emailSuccess && deviceNameSuccess){var accountLogic = context.HttpContext.RequestServices.GetService();var hasClaim = accountLogic.ValidateLogin(email, token, deviceName).Result.Success;如果 (!hasClaim){context.HttpContext.ForbidAsync();}}别的{context.HttpContext.ForbidAsync();}}

}

我已经在我的启动中注册了过滤器

 public void ConfigureServices(IServiceCollection services){services.Configure(Configuration.GetSection("ConnectionStrings"));services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);services.AddScoped();

但是当我导航到使用过滤器的操作时出现此错误

[HttpPost][ClaimRequirement("权限", ClaimRoles.Admin)]公共异步任务 ResetLeaderboard()

<块引用>

InvalidOperationException: 适合类型 'Foosball.Logic.ClaimRequirementFilter' 的构造函数无法定位.确保类型是具体的,并且为公共构造函数的所有参数注册了服务

github:https://github.com/Mech0z/Foosball/tree/core2.1/Foosball

解决方案

正如你的代码

Arguments = new object[] {new Claim(claimType, claimValue.ToString()) };

您需要添加以下构造函数:

public ClaimRequirementFilter(Claim claim){}

那是因为 内部构造函数解析逻辑 使用 TypeFilterAttribute.Argument 属性来决定使用哪个构造函数进行实例化.

I have made a claims filter

public class ClaimRequirementAttribute : TypeFilterAttribute
{
    public ClaimRequirementAttribute(string claimType, ClaimRoles claimValue) : base(typeof(ClaimRequirementFilter))
    {
        Arguments = new object[] {new Claim(claimType, claimValue.ToString()) };
    }
}

public class ClaimRequirementFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var headers = context.HttpContext.Request.Headers;

        var tokenSuccess = headers.TryGetValue("Token", out var token);

        var emailSuccess = headers.TryGetValue("Email", out var email);

        var deviceNameSuccess = headers.TryGetValue("DeviceName", out var deviceName);

        if (tokenSuccess && emailSuccess && deviceNameSuccess)
        {
            var accountLogic = context.HttpContext.RequestServices.GetService<IAccountLogic>();

            var hasClaim = accountLogic.ValidateLogin(email, token, deviceName).Result.Success;

            if (!hasClaim)
            {
                context.HttpContext.ForbidAsync();
            }
        }
        else
        {
            context.HttpContext.ForbidAsync();
        }
    }

}

I have registered the filter in my startup

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<ConnectionStringsSettings>(Configuration.GetSection("ConnectionStrings"));
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddScoped<ClaimRequirementFilter>();

But I get this error when I navigate to an action that uses the filter

[HttpPost]
[ClaimRequirement("Permission", ClaimRoles.Admin)]
public async Task ResetLeaderboard()

InvalidOperationException: A suitable constructor for type 'Foosball.Logic.ClaimRequirementFilter' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor

github: https://github.com/Mech0z/Foosball/tree/core2.1/Foosball

解决方案

As your code has

Arguments = new object[] {new Claim(claimType, claimValue.ToString()) };

you need to add the following constructor:

public ClaimRequirementFilter(Claim claim)
{

}

That is because the internal constructor resolving logic uses TypeFilterAttribute.Argument property to decide what constructor to use for instantiation.

这篇关于由于缺少合适的构造函数,aspnet core 2.1 操作过滤器出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆