Azure 云服务:System.Net.Http.Formatting.dll 请求旧 Newtonsoft.Json.dll -> 角色初始化失败
Azure cloud service: System.Net.Http.Formatting.dll requests old Newtonsoft.Json.dll -> role initialization fails
我有大约 80 个项目的相当大的解决方案,运行 在 Azure 云服务服务器上作为 Web 角色使用 WebAPI (v1)。我通过实施自定义 JsonReader/Writer
创建了有关内容协商的新增强功能。当我尝试通过基于 BaseJsonMediaTypeFormatter
实现自定义 MediaTypeFormatter
来使用它时,它失败了——准确地说,它在发布到 Azure 时失败了。本地模拟它完美运行。一旦发布,它就失败了:
...
Role entrypoint could not be created: System.TypeLoadException: Unable to load the role entry point due to the following exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
(Fully-specified)
LOG: Appbase = file:///E:/approot/bin
LOG: Initial PrivatePath = E:\approot\bin
Calling assembly : System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
...
(从事件查看器捕获的日志->应用程序和服务日志->Windows Azure)。
直到我尝试使用我的自定义 MediaTypeFormatter
一切正常。我已经在互联网和 SO 上搜索了一些解决方案,尽管问题并不像我认为的那样罕见 none 解决方案对我有所帮助。我尝试了什么:
- 整合了所有引用项目中
Newtonsoft.Json
nugets 的所有版本
- 合并了所有版本的
Microsoft.AspNet.WebApi.Client
nuget
- 删除了对两个提到的库的所有引用,并通过引用 nuget 替换了对 dll 的这些引用
- 将两个 Nuget 包升级到最新版本(Json 12.0.3 和格式化 5.2.7)(我什至尝试在
Update-Package
命令中使用 -reinstall 参数)
- 手动检查了所有
csproj
以引用旧的 Newtonsoft.Json
版本。
- 清理了解决方案、bin、obj 文件夹、所有缓存文件
- 我的
web.config
文件包含(并且一直包含)正确的 bindingRedirect
Newtonsoft.Json
- (可能还有其他一些东西,我已经忘记了)
None 的解决方案有效,但我仍然收到这条奇怪的消息。
我的问题是:
- 当我明确说它应该重定向到第 12 个版本时,
System.Net.Http.Formatting
库怎么可能需要某个特定版本的 Newtonsoft.Json?是因为它发生在 Webrole 启动期间(可能是因为它还不尊重 web.config?)
- 为什么它在我的电脑上运行,但没有部署在 Azure 云服务上?它是否以某种方式在我的本地计算机上找到并使用了 Newtonsoft.Json lib 的旧版本(以及在哪里,以便我可以尝试将其删除)?
- 有没有更好的方法来调试这个问题?也许记录加载引用的 DLL 的顺序以更接近错误?或者在我的本地计算机上复制错误?目前部署应用程序、登录远程桌面并检查云服务上的 EventViewer 非常耗时...
任何发现问题的提示都将不胜感激。
您的 web.config 程序集绑定非常接近解决方案。但是,错误消息显示“无法加载 角色入口点 ”。您的角色入口点是托管 OnStart/Run 方法(即 WebRole1.dll)的二进制文件,这与您在 IIS 中托管的网站内容不同。
要解决此问题,请打开位于项目 bin 文件夹中的 .dll.config 并使用相同的程序集绑定信息,然后重新部署您的服务。
我有大约 80 个项目的相当大的解决方案,运行 在 Azure 云服务服务器上作为 Web 角色使用 WebAPI (v1)。我通过实施自定义 JsonReader/Writer
创建了有关内容协商的新增强功能。当我尝试通过基于 BaseJsonMediaTypeFormatter
实现自定义 MediaTypeFormatter
来使用它时,它失败了——准确地说,它在发布到 Azure 时失败了。本地模拟它完美运行。一旦发布,它就失败了:
...
Role entrypoint could not be created: System.TypeLoadException: Unable to load the role entry point due to the following exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
(Fully-specified)
LOG: Appbase = file:///E:/approot/bin
LOG: Initial PrivatePath = E:\approot\bin
Calling assembly : System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
...
(从事件查看器捕获的日志->应用程序和服务日志->Windows Azure)。
直到我尝试使用我的自定义 MediaTypeFormatter
一切正常。我已经在互联网和 SO 上搜索了一些解决方案,尽管问题并不像我认为的那样罕见 none 解决方案对我有所帮助。我尝试了什么:
- 整合了所有引用项目中
Newtonsoft.Json
nugets 的所有版本 - 合并了所有版本的
Microsoft.AspNet.WebApi.Client
nuget - 删除了对两个提到的库的所有引用,并通过引用 nuget 替换了对 dll 的这些引用
- 将两个 Nuget 包升级到最新版本(Json 12.0.3 和格式化 5.2.7)(我什至尝试在
Update-Package
命令中使用 -reinstall 参数) - 手动检查了所有
csproj
以引用旧的Newtonsoft.Json
版本。 - 清理了解决方案、bin、obj 文件夹、所有缓存文件
- 我的
web.config
文件包含(并且一直包含)正确的bindingRedirect
Newtonsoft.Json
- (可能还有其他一些东西,我已经忘记了)
None 的解决方案有效,但我仍然收到这条奇怪的消息。 我的问题是:
- 当我明确说它应该重定向到第 12 个版本时,
System.Net.Http.Formatting
库怎么可能需要某个特定版本的 Newtonsoft.Json?是因为它发生在 Webrole 启动期间(可能是因为它还不尊重 web.config?) - 为什么它在我的电脑上运行,但没有部署在 Azure 云服务上?它是否以某种方式在我的本地计算机上找到并使用了 Newtonsoft.Json lib 的旧版本(以及在哪里,以便我可以尝试将其删除)?
- 有没有更好的方法来调试这个问题?也许记录加载引用的 DLL 的顺序以更接近错误?或者在我的本地计算机上复制错误?目前部署应用程序、登录远程桌面并检查云服务上的 EventViewer 非常耗时...
任何发现问题的提示都将不胜感激。
您的 web.config 程序集绑定非常接近解决方案。但是,错误消息显示“无法加载 角色入口点 ”。您的角色入口点是托管 OnStart/Run 方法(即 WebRole1.dll)的二进制文件,这与您在 IIS 中托管的网站内容不同。
要解决此问题,请打开位于项目 bin 文件夹中的 .dll.config 并使用相同的程序集绑定信息,然后重新部署您的服务。