ReflectionTypeLoadException:在 azure 上发布 asp.net mvc 项目后无法加载类型
ReflectionTypeLoadException: Could not load types after publishing a asp.net mvc project on azure
所以我有这个 asp.net mvc 项目,它是根据 visual studio 在 .NetFramework 4.7.2 下为您提供的默认模板创建的,并下载了 sensenet.service.install 和 sensenet.webpages.install 包和 运行 通过安装它们的过程。之后,我按 F5 确认我的机器上一切正常。从那里,我决定在 azure 上发布这个项目,当网页加载时我看到的是这个
[Exception: ReflectionTypeLoadException: Could not load types. Affected types:
Lucene.Net.Store.RAMDirectory
Lucene.Net.Search.FieldDoc
Lucene.Net.Search.NumericRangeQuery
Lucene.Net.Search.SortField
Lucene.Net.Index.Term
First message: Type 'Lucene.Net.Store.RAMDirectory' in assembly 'Lucene.Net, Version=2.9.4.301, Culture=neutral, PublicKeyToken=null' has method 'OnDeserialized' with an incorrect signature for the serialization attribute that it is decorated with.]
SenseNet.Services.SenseNetGlobal.get_Instance() in E:\BuildAgent\_work\s\src\Services\SenseNetGlobal.cs:74
SenseNet.Portal.Global.Application_Start(Object sender, EventArgs e) in E:\BuildAgent\_work\s\src\Services\Global.cs:15
[HttpException (0x80004005): ReflectionTypeLoadException: Could not load types. Affected types:
Lucene.Net.Store.RAMDirectory
Lucene.Net.Search.FieldDoc
Lucene.Net.Search.NumericRangeQuery
Lucene.Net.Search.SortField
Lucene.Net.Index.Term
First message: Type 'Lucene.Net.Store.RAMDirectory' in assembly 'Lucene.Net, Version=2.9.4.301, Culture=neutral, PublicKeyToken=null' has method 'OnDeserialized' with an incorrect signature for the serialization attribute that it is decorated with.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +10062153
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +118
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +173
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +336
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +296
[HttpException (0x80004005): ReflectionTypeLoadException: Could not load types. Affected types:
Lucene.Net.Store.RAMDirectory
Lucene.Net.Search.FieldDoc
Lucene.Net.Search.NumericRangeQuery
Lucene.Net.Search.SortField
Lucene.Net.Index.Term
First message: Type 'Lucene.Net.Store.RAMDirectory' in assembly 'Lucene.Net, Version=2.9.4.301, Culture=neutral, PublicKeyToken=null' has method 'OnDeserialized' with an incorrect signature for the serialization attribute that it is decorated with.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +10043444
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +95
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +254
在这个 github 问题 https://github.com/dotnet/standard/issues/300 中有一条评论说这已在 .NetFramework 4.7.2 中修复,但对我来说似乎并非如此。
所以我的问题是,当我 运行 这个项目在本地而不是在 Azure 上发布时,为什么没有发生这个异常?
您假设这与 .Net Framework 中的那个修复有关是正确的。它发生在 4.7.2 中,因为您发现的二进制序列化/类型转发问题表明。
(可以找到有关将 sensenet 迁移到 .Net Standard 的更多详细信息here)
我们在 Azure 测试环境中面临同样的问题,原因是 4.7.2 尚未部署到 Azure App Service(或者至少不是所有地方)。最初的计划是在 2018 年 9 月进行,但他们根据 this issue.
将其推迟到 10 月
这不是我们能控制的,所以解决办法是
wait for Microsoft to deploy 4.7.2 to App Service
要检查您的 Azure 环境是否支持 .Net Framework,请检查 this article。
关于将 sensenet 部署到应用服务
您所尝试的(将 sn 部署到 Azure)在技术上是可行的,您需要的一切都已发布,但还没有详细的指南。不过我们正在努力。
简而言之:
- 将数据库(很可能是 backup/restore)部署到 Azure SQL 服务器。
- 配置消息传递,因为您的应用程序实例必须相互通信。在本地环境中,我们通常使用 MSMQ,但在云中不可用,因此我们为 sensenet 提供 RabbitMQ messaging provider。
- 索引:这更复杂,因为您必须为 centralized search service 启动 VM 并在那里安装服务。
计划在未来使所有这些变得更容易和更直接,但感谢您开拓新事物:)。
所以我有这个 asp.net mvc 项目,它是根据 visual studio 在 .NetFramework 4.7.2 下为您提供的默认模板创建的,并下载了 sensenet.service.install 和 sensenet.webpages.install 包和 运行 通过安装它们的过程。之后,我按 F5 确认我的机器上一切正常。从那里,我决定在 azure 上发布这个项目,当网页加载时我看到的是这个
[Exception: ReflectionTypeLoadException: Could not load types. Affected types:
Lucene.Net.Store.RAMDirectory
Lucene.Net.Search.FieldDoc
Lucene.Net.Search.NumericRangeQuery
Lucene.Net.Search.SortField
Lucene.Net.Index.Term
First message: Type 'Lucene.Net.Store.RAMDirectory' in assembly 'Lucene.Net, Version=2.9.4.301, Culture=neutral, PublicKeyToken=null' has method 'OnDeserialized' with an incorrect signature for the serialization attribute that it is decorated with.]
SenseNet.Services.SenseNetGlobal.get_Instance() in E:\BuildAgent\_work\s\src\Services\SenseNetGlobal.cs:74
SenseNet.Portal.Global.Application_Start(Object sender, EventArgs e) in E:\BuildAgent\_work\s\src\Services\Global.cs:15
[HttpException (0x80004005): ReflectionTypeLoadException: Could not load types. Affected types:
Lucene.Net.Store.RAMDirectory
Lucene.Net.Search.FieldDoc
Lucene.Net.Search.NumericRangeQuery
Lucene.Net.Search.SortField
Lucene.Net.Index.Term
First message: Type 'Lucene.Net.Store.RAMDirectory' in assembly 'Lucene.Net, Version=2.9.4.301, Culture=neutral, PublicKeyToken=null' has method 'OnDeserialized' with an incorrect signature for the serialization attribute that it is decorated with.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +10062153
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +118
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +173
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +336
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +296
[HttpException (0x80004005): ReflectionTypeLoadException: Could not load types. Affected types:
Lucene.Net.Store.RAMDirectory
Lucene.Net.Search.FieldDoc
Lucene.Net.Search.NumericRangeQuery
Lucene.Net.Search.SortField
Lucene.Net.Index.Term
First message: Type 'Lucene.Net.Store.RAMDirectory' in assembly 'Lucene.Net, Version=2.9.4.301, Culture=neutral, PublicKeyToken=null' has method 'OnDeserialized' with an incorrect signature for the serialization attribute that it is decorated with.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +10043444
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +95
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +254
在这个 github 问题 https://github.com/dotnet/standard/issues/300 中有一条评论说这已在 .NetFramework 4.7.2 中修复,但对我来说似乎并非如此。
所以我的问题是,当我 运行 这个项目在本地而不是在 Azure 上发布时,为什么没有发生这个异常?
您假设这与 .Net Framework 中的那个修复有关是正确的。它发生在 4.7.2 中,因为您发现的二进制序列化/类型转发问题表明。
(可以找到有关将 sensenet 迁移到 .Net Standard 的更多详细信息here)
我们在 Azure 测试环境中面临同样的问题,原因是 4.7.2 尚未部署到 Azure App Service(或者至少不是所有地方)。最初的计划是在 2018 年 9 月进行,但他们根据 this issue.
将其推迟到 10 月这不是我们能控制的,所以解决办法是
wait for Microsoft to deploy 4.7.2 to App Service
要检查您的 Azure 环境是否支持 .Net Framework,请检查 this article。
关于将 sensenet 部署到应用服务
您所尝试的(将 sn 部署到 Azure)在技术上是可行的,您需要的一切都已发布,但还没有详细的指南。不过我们正在努力。
简而言之:
- 将数据库(很可能是 backup/restore)部署到 Azure SQL 服务器。
- 配置消息传递,因为您的应用程序实例必须相互通信。在本地环境中,我们通常使用 MSMQ,但在云中不可用,因此我们为 sensenet 提供 RabbitMQ messaging provider。
- 索引:这更复杂,因为您必须为 centralized search service 启动 VM 并在那里安装服务。
计划在未来使所有这些变得更容易和更直接,但感谢您开拓新事物:)。