Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net Core 3.1中的自定义ActionFilterAttribute返回:无法解析类型为';System.String';_C#_.net Core_.net Core 3.1_Actionfilterattribute_Custom Action Filter - Fatal编程技术网

C# .Net Core 3.1中的自定义ActionFilterAttribute返回:无法解析类型为';System.String';

C# .Net Core 3.1中的自定义ActionFilterAttribute返回:无法解析类型为';System.String';,c#,.net-core,.net-core-3.1,actionfilterattribute,custom-action-filter,C#,.net Core,.net Core 3.1,Actionfilterattribute,Custom Action Filter,我正在将.Net Core 2.2应用程序迁移到3.1版 我有以下操作筛选器: public class MyFilterAttribute : ActionFilterAttribute { private readonly string _name; private readonly int _num; private readonly string _type; public MyFilterAttribute(string name, int num,

我正在将.Net Core 2.2应用程序迁移到3.1版

我有以下操作筛选器:

public class MyFilterAttribute : ActionFilterAttribute
{
    private readonly string _name;
    private readonly int _num;
    private readonly string _type;

    public MyFilterAttribute(string name, int num, string type)
    {
        _name = name;
        _num = num;
        _type = type;
    }

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        ...
        await base.OnActionExecutionAsync(context, next);
    }
}
我在Startup.cs文件中注册此筛选器,如下所示:

services.AddTransient<MyFilterAttribute>();
public class MyController : Controller
{
    [MyFilter("some-name", 5000, "some-type")]
    public async Task MyAction()
    {
        ...
    }
}
services.AddControllersWithViews(config =>
{
    config.Filters.Add<MyFilterAttribute>();
})
此过滤器在我的.Net Core 2.2应用程序中运行良好。但是,现在,当我尝试迁移到3.1版时,出现以下异常:

发生异常:CLR/System.AggregateException未经处理 中发生“System.AggregateException”类型的异常 Microsoft.Extensions.DependencyInjection.dll:'某些服务不可用 可以构造“找到内部异常”,请参阅中的$exception 变量窗口以获取更多详细信息。最里面的异常
System.InvalidOperationException:无法解析类型的服务 尝试激活时出现“System.String” “我的应用程序。过滤器。我的过滤器属性”。在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(类型 serviceType,Type implementationType,CallSiteChain CallSiteChain, ParameterInfo[]参数,布尔throwIfCallSiteNotFound)位于 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache 生存期,类型serviceType,类型implementationType,CallSiteChain callSiteChain)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor 描述符,类型serviceType,CallSiteChain CallSiteChain,Int32插槽) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor,CallSiteChain CallSiteChain)位于 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService(ServiceDescriptor 描述符)

我尝试全局添加过滤器,如下所示:

services.AddTransient<MyFilterAttribute>();
public class MyController : Controller
{
    [MyFilter("some-name", 5000, "some-type")]
    public async Task MyAction()
    {
        ...
    }
}
services.AddControllersWithViews(config =>
{
    config.Filters.Add<MyFilterAttribute>();
})
services.addControllersWithView(配置=>
{
config.Filters.Add();
})
但我也有同样的错误

Net Core读取.Net Core 3.1中自定义筛选器的方式是否发生了变化

我在迁移中断更改文档中没有看到任何相关内容。

根据此(),您的所有操作筛选器都由DI解析,这意味着您的2个字符串参数也将被解析。这就导致了你的错误

您可能想考虑使用不同类型的过滤器,而不需要通过DI.< /P>解决。 请看下面两种类型的过滤器

public class AddHeaderAttribute : ResultFilterAttribute
public class MyActionFilterAttribute : ActionFilterAttribute
Alex和Nkosi的回答(/comments)是正确的,第一个实现的问题是过滤器是在依赖注入机制中构造的,DI不知道如何处理字符串参数

老实说,我不知道这是如何工作的,但我确实有一个.Net Core 2.2应用程序正在生产中,并以这种方式实现了过滤器

无论如何,我将过滤器更改为
TypeFilterAttribute
,现在它在.Net Core 3.1中再次工作(无需在DI中注册):

在这个实现中,我们首先定义一个
TypeFilterAttribute
并在其中调用一个
ActionFilterAttribute
,我们可以使用一个漂亮的注释调用过滤器:

[MyFilter(“某个名字”,5000,“某个类型”)]

而不是:


[TypeFilter(typeof(MyFilterAttribute),Arguments=new object[]{“some name”,5000,“some type”})]

我发现很难相信在以前的版本中将其添加到服务集合中会起作用<代码>公共MyFilterAttribute(字符串名称、int num、字符串类型)容器不知道如何解决这些问题parameters@Nkosi我明白你的意思,然而,我有一个正在生产的.net core 2.2应用程序,带有这个精确的过滤器…特别是这一节,你应该在回答中引用特定的部分,否则这更适合作为一个注释。