C# .Net Core 3.1中的自定义ActionFilterAttribute返回:无法解析类型为';System.String';
我正在将.Net Core 2.2应用程序迁移到3.1版 我有以下操作筛选器: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,
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应用程序,带有这个精确的过滤器…特别是这一节,你应该在回答中引用特定的部分,否则这更适合作为一个注释。