【问题标题】:Need help troubleshooting TypeLoadException at .NET webapi2 application startup在 .NET webapi2 应用程序启动时需要帮助解决 TypeLoadException
【发布时间】:2017-09-12 12:53:03
【问题描述】:

我有一个工作 webapi2 应用程序,其中引用了我们拥有的一些公共/共享库程序集。这些共享库具有不同的存储库,它们在构建过程中作为 nuget 包发布。最近,我将 webapi2 应用程序的 nuget 包引用更新为这些常见包的更新版本。其中一个程序集 Microsoft.Icm.Common.Web 的较新版本不再具有属性 WebApiExceptionHandlerAttribute。因此,在构建 webapi2 应用程序时,我删除了 webapi2 控制器类中对该属性的所有引用。当我重建应用程序并将其部署到我们的暂存环境之一时,我看到以下类型加载异常:

消息:无法从程序集“Microsoft.Icm.Common.Web,Version=2.4.0.0,Culture=neutral,PublicKeyToken=null”加载类型“Microsoft.Icm.Common.Web.WebApiExceptionHandlerAttribute”。

StackTrace:在 System.ModuleHandle.ResolveType(RuntimeModule 模块,Int32 typeToken,IntPtr* typeInstArgs,Int32 typeInstCount,IntPtr* methodInstArgs,Int32 methodInstCount,ObjectHandleOnStack 类型) 在 System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule 模块,Int32 typeToken,RuntimeTypeHandle[] typeInstantiationContext,RuntimeTypeHandle[] methodInstantiationContext) 在 System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken,Type[] genericTypeArguments,Type[] genericMethodArguments) 在 System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord,MetadataImport 范围,Assembly 和 lastAptcaOkAssembly,RuntimeModule 装饰模块,MetadataToken 装饰令牌,RuntimeType attributeFilterType,Boolean mustBeInheritable,Object[] 属性,IListderivedAttributes,RuntimeType&attributeType,IRuntimeMethodInfo&ctor,Boolean&ctorHasParameters,Boolean&isVar 在 System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule 装饰模块,Int32 装饰元数据令牌,Int32 pcaCount,RuntimeType attributeFilterType,布尔 mustBeInheritable,IList 派生属性,布尔 isDecoratedTargetSecurityTransparent) 在 System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType 类型,RuntimeType caType,布尔继承) 在 System.Web.Http.Controllers.HttpControllerDescriptor.InvokeAttributesOnControllerType(HttpControllerDescriptor 控制器描述符,类型类型) 在 System.Web.Http.Controllers.HttpControllerDescriptor..ctor(HttpConfiguration 配置,字符串控制器名称,类型控制器类型) 在 System.Web.Http.Dispatcher.DefaultHttpControllerSelector.InitializeControllerInfoCache() 在 System.Lazy1.CreateValue() at System.Lazy1.LazyInitValue() 在 System.Web.Http.Dispatcher.DefaultHttpControllerSelector.GetControllerMapping() 在 System.Web.Http.Routing.AttributeRoutingMapper.AddRouteEntries(SubRouteCollection 收集器,HttpConfiguration 配置,IInlineConstraintResolver constraintResolver,IDirectRouteProvider directRouteProvider) 在 System.Web.Http.Routing.AttributeRoutingMapper.c__DisplayClass2.c__DisplayClass4.b__1() 在 System.Web.Http.Routing.RouteCollectionRoute.EnsureInitialized(Func`1 初始化程序) 在 System.Web.Http.Routing.AttributeRoutingMapper.c__DisplayClass2.b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 System.Web.OData.Routing.Conventions.AttributeRoutingConvention.c__DisplayClass1.<.ctor>b__0(HttpConfiguration 配置) 在 Microsoft.AzureAd.Icm.IcmV3OData.Global.Initialize() 在 E:\bt\787852\repo\src\OData\ICMV3OData\Global.asax.cs:line 66 在 Microsoft.AzureAd.Icm.IcmV3OData.PreLoadInitializationClient.Preload(String[] 参数) 在 E:\bt\787852\repo\src\OData\ICMV3OData\App_Start\PreLoadInitializationClient.cs:line 40 在 System.Web.Hosting.PreloadHost.CreateIProcessHostPreloadClientInstanceAndCallPreload(字符串 preloadObjTypeName,字符串 [] paramsForStartupObj) 在 System.Web.Hosting.PreloadHost.CreateIProcessHostPreloadClientInstanceAndCallPreload(字符串 preloadObjTypeName,字符串 [] paramsForStartupObj) 在 System.Web.Hosting.ProcessHost.PreloadApplicationIfRequired(字符串 appId,IApplicationHost appHostParameter,HostingEnvironmentParameters hostingParameters,LockableAppDomainContext ac)'。工作进程将被标记为不健康并被关闭。数据字段包含错误代码。

尽管我最近构建的 webapi2 应用程序不应该再引用不可用的 WebApiExceptionHandlerAttribute(在较新的 Microsoft.Icm.Common.Web 程序集中),但在运行应用程序时,似乎以某种方式使用了不可用的属性。我使用了 Resharper 的 dotnetpeek 之类的工具,并在 binplaced 程序集中搜索了术语“WebApiExceptionHandlerAttribute”,但我没有看到该属性的任何匹配项。那么,我该如何弄清楚为什么 Web 应用程序在应用程序启动时仍试图定位该类型?

【问题讨论】:

    标签: asp.net .net-assembly typeloadexception


    【解决方案1】:

    我已确定此问题的根本原因。看起来我在 webapi2 应用程序的 bin 文件夹中有另一个陈旧的程序集,该程序集已被弃用近 3 个月,并且在构建应用程序时不再生成。那个陈旧的程序集引用了现已失效的属性。一旦我从 iis webapi2 应用程序文件夹中删除了陈旧的程序集,一切就开始正常了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多