autofac - 无法在 asp.net core 3.1 应用程序中的类/接口上连接拦截器
问题描述
包:Autofac.Extensions.DependencyInjection (6.0.0)、Autofac.extras.DynamicProxy(4.5.0)
我正在尝试通过遵循 ASP.NET Core 4.0 和拦截器文档,为我们的所有服务类/接口在我们的应用程序中为 Web API 控制器提供拦截器原型。拦截器只是一个使用 Serlog 的简单 Log 操作:
public MethodCallInterceptor()
{
}
public void Intercept(IInvocation invocation)
{
var text = invocation.Method.Name;
Log.Logger.Debug($"Interceptor (Method): {text}");
invocation.Proceed();
}
我们的主应用程序将 Autofac 与 ComApiApplication 设置为“启动”类:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<ComsApiApplication>());
}
在 ComsApiApplication 中,我在 ConfigureServices 中注册了大部分 ASP.NET MVC 服务(例如身份验证、授权等)。然后,我在其 ConfigureContainer 函数中为我们的几个服务组合中的类连接拦截器:
public void ConfigureContainer(ContainerBuilder builder)
{
foreach (var assembly in Options.Assemblies)
{
// Add application services: IService => Service.
var registrations = assembly.GetExportedTypes()
.Where(type => type.Namespace != null && type.Namespace.Contains(".Services") && type.GetInterfaces().Any() && !type.IsAbstract)
.Select(type => new
{
Service = type.GetInterfaces().Single(inf => inf.Name.Contains(type.Name)),
Implementation = type
});
foreach (var registration in registrations)
{
//builder.RegisterType(registration.Implementation).As(registration.Service).InstancePerDependency().EnableInterfaceInterceptors().InterceptedBy(typeof(MethodCallInterceptor));
builder.RegisterType(registration.Implementation).As(registration.Service).EnableInterfaceInterceptors().InstancePerDependency().InterceptedBy(typeof(MethodCallInterceptor));
}
builder.Register(c => new MethodCallInterceptor());
}
}
但是,当我使用导致调用这些服务中的接口函数的请求运行应用程序时(我们的接口和服务类中存在继承),我收到以下异常,并感谢您在确定我的问题时提供的任何帮助:
Autofac.Core.DependencyResolutionException:执行解析操作时引发异常。有关详细信息,请参阅 InnerException。---> Castle.DynamicProxy.ProxyGenerationException: 这是一个 DynamicProxy2 错误:代理的目标类型实现 Castle.DynamicProxy.IProxyTargetAccessor 这是一个 DynamicProxy 基础设施接口,你永远不应该自己实现它。您是否尝试代理现有代理?在 Castle.DynamicProxy.Generators.BaseProxyGenerator.HandleExplicitlyPassedProxyTargetAccessor(ICollection 1 targetInterfaces, ICollection
1 additionalInterfaces) 在 Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GetTypeImplementerMapping(Type[] 接口,类型 proxyTargetType,IEnumerable1& contributors, INamingScope namingScope)
at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateType(String typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope)
at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.<>c__DisplayClass6_0.<GenerateCode>b__0(String n, INamingScope s)
at Castle.DynamicProxy.Generators.BaseProxyGenerator.ObtainProxyType(CacheKey cacheKey, Func
3 工厂)在 Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options) at Castle.DynamicProxy.DefaultProxyBuilder.CreateInterfaceProxyTypeWithTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, Type targetType, ProxyGenerationOptions options) at Castle .DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, Type targetType, ProxyGenerationOptions options) at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, Object target, ProxyGenerationOptions options, IInterceptor[] 拦截器) at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(类型 interfaceToProxy,Type[] additionalInterfacesToProxy, Object target, IInterceptor[] 拦截器)在 Autofac.Extras.DynamicProxy.RegistrationExtensions.<>c__DisplayClass9_03.<EnableInterfaceInterceptors>b__0(Object sender, ActivatingEventArgs
1 e) 在1 parameters, Object& instance)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
Autofac.Core.Resolving.InstanceLookup.Execute() 在 Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(IShareingLifetimeScope currentOperationScope, ResolveRequest request) 在 Autofac.Core.Resolving.ResolveOperation.ResolveComponent(ResolveRequest request) 在 Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request) --- 内部异常堆栈跟踪结束 --- 在 Autofac.Core.Resolving。 Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest 请求)处 Autofac.ResolutionExtensions.TryResolveService(IComponentContext 上下文,服务服务,IEnumerable 处的 ResolveOperation.Execute(ResolveRequest 请求)1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable
1 个参数)在 Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType) 在 Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 参数) 在 Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetService(Type serviceType) 在 Microsoft .Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.b__0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0。g__CreateController|0(ControllerContext controllerContext) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- End从以前抛出异常的位置的堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|25_0(ResourceInvoker 调用程序,Task lastTask,State next,Scope 范围,Object state,Boolean isCompleted)Microsoft.AspNetCore。 Mvc.Infrastructure.SystemTextJsonResultExecutor:信息:正在执行 JsonResult,写入“System.String”类型的值。isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- 从先前引发异常的位置结束堆栈跟踪--- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|25_0(ResourceInvoker 调用程序, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor:信息:正在执行 JsonResult,写入“System.String”类型的值。isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- 从先前引发异常的位置结束堆栈跟踪--- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|25_0(ResourceInvoker 调用程序, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor:信息:正在执行 JsonResult,写入“System.String”类型的值。Boolean isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor:信息:正在执行 JsonResult,写入“System.String”类型的值。Boolean isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor:信息:正在执行 JsonResult,写入“System.String”类型的值。
解决方案
以下来自谷歌翻译:巧合的是,我刚刚解决了这个问题,但这不是正确的解决方案。只需要将 Autofac.Extensions.DependencyInjection 包降级到5.0.1即可解决问题。
推荐阅读
- kotlin - InputStream getResource() 返回 NULL
- jenkins - Linux:找不到回退包文件夹“C:\Program Files\dotnet\sdk\NuGetFallbackFolder”
- javascript - Google Sheets JavaScript - TypeError:无法读取未定义的属性“getSheetName”
- acumatica - 支票和付款出现空“发票日期”错误
- python - 从具有嵌套结构的字典中删除混合数据类型的空值和空对象
- domain-driven-design - 基于AOP的业务规则分离
- sql - 为什么交替查询过滤器顺序没有给我相同的结果
- python - Docker compose 从 .env 文件中获取环境变量并传递给 docker build
- gentics-mesh - 如何指定要从 Gentics Mesh 查询的模式(或索引)(无 graphQL API)
- android - Xamarin.Forms 将文件 (pdf) 保存在本地存储中并使用默认查看器打开