无法使用表存储在 Azure 云工作者角色中加载文件或程序集 Microsoft.Data.OData 版本 = 5.2.0.0 错误
Posted
技术标签:
【中文标题】无法使用表存储在 Azure 云工作者角色中加载文件或程序集 Microsoft.Data.OData 版本 = 5.2.0.0 错误【英文标题】:Could not load file or assembly Microsoft.Data.OData Version=5.2.0.0 error in Azure Cloud Worker Role using Table Storage 【发布时间】:2013-05-30 06:59:26 【问题描述】:我在使用 Azure 表存储时遇到了一个非常特殊的问题。我在 Visual Studio 2012 中有一个 .NET 4.5 项目,我在其中处理所有 Azure 表存储功能。这个项目/dll 被另外两个项目引用,我的 MVC 网站和我的 Azure Worker Role。 (我在我机器上的 Azure Emulators 下运行,但是当我将它部署到云时也会发生)
我在保存或检索记录时调用了以下函数:
internal static CloudTable GetTable(CloudStorageAccount storageAccount, string tableReference)
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(tableReference);
table.CreateIfNotExists();
return tableClient.GetTableReference(table.Name);
在我的 MVC 网站中,我有一个函数可以将记录保存到 Azure 存储表,然后在我的 Azure Worker Role 中有一个可以读取记录的服务。
所以两者都使用相同的 dll 进行存储和检索,但是我的 MVC 项目在保存记录时没有问题,但是在我的 Azure Worker 角色服务中,当它尝试检索记录时会在尝试执行“table. CreateIfNotExists();"。
无法加载文件或程序集 'Microsoft.Data.OData, 版本=5.2.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 或 它的依赖项之一。定位程序集的清单定义 与程序集引用不匹配。 (HRESULT 的例外情况: 0x80131040)
我已经做了以下事情:
-
将所有 NuGet 包从解决方案级别更新到最新版本
我检查了每个项目参考,以确保没有旧的 dll 或以前的版本,特别是 System.Spatial、Microsoft.WindowsAzure.Configuration、Microsoft.WindowsAzure.ServiceRuntime 和 Microsoft.ServiceBus、Microsoft.WindowsAzure .Storage、Microsoft.Data.Edm 和 Microsoft.Data.OData
我什至从头开始创建了一个新的 Cloud Service 和 WorkerRole 项目,以确保当前 WorkerRole 项目中的某些东西不会损坏。
我还没有将 dll 回滚到 5.2,因为我在使用 5.3 以后的特定功能的其他项目中遇到了太多问题。
我目前在 5.5 上运行所有 dll。
当我运行找到 here 的 AsmSpy.exe 实用程序时,我得到以下输出,我不能 100% 确定如何解释。
> Reference: Microsoft.Data.Edm
> 5.5.0.0 by Microsoft.Data.OData
> 5.5.0.0 by Microsoft.Data.Services.Client
> 5.5.0.0 by Microsoft.WindowsAzure.ActiveDirectory.GraphHelper.2013_04_05
> Reference: System.Spatial
> 5.5.0.0 by Microsoft.Data.OData
> 5.5.0.0 by Microsoft.Data.Services.Client Reference: Microsoft.Data.OData
> 5.5.0.0 by Microsoft.Data.Services.Client
> 5.2.0.0 by Microsoft.WindowsAzure.Storage <-- THIS SEEMS TO BE THE ONE THAT IS CAUSING ISSUES
我如何解释它,是 Microsoft.WindowsAzure.Storage dll 引用了 Microsoft.Data.OData dll 的 V 5.2.0.0,但如果这是问题所在,我该如何解决?根据我在 Storage dll 上看到的文档,它应该引用 5.4 及更高版本,而不是 5.2...?
【问题讨论】:
我在 Github 上打开了一个问题 [github.com/WindowsAzure/azure-sdk-for-net/issues/214] 所以希望这是问题所在,他们可以尽快解决。 我建议你关闭那个问题 我已关闭它。谢谢 也可以在运行时使用live.sysinternals.com/dbgview.exe 来检测此类问题。这就是我如何在我的 webrole 的已发布版本上找到神秘失败的原因。 【参考方案1】:为这样一个容易解决的问题打开问题对你没有帮助。
将以下附加配置放入各自的配置文件中(MVC 为 web.config,worker 角色为 app.config):
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
注意runtime
部分是configuration
根元素的直接后代!我很确定您的 web.config 中已经包含此部分,因为 MVC4 使用它将所有对 System.Web.MVC
的引用重新绑定到最新版本。
我个人并不期望 SDK 会随着每个引用库的每个新版本而更新!这太疯狂了……
【讨论】:
谢谢你,解决了它,但我不同意你的观点。 Microsoft 正在将他们更新/部署事物的方式从 12/18 个月的路径更改为使用 NuGet 和定期更新的快速升级/部署。这使得 dll 版本的管理比过去每年更改一次更加重要,现在它们在这些 Azure 包上每周更改一次。因此,为了帮助我们避免与 dll 版本地狱作斗争,他们至少应该创建 NuGet 包以自动更新配置文件。现在我知道这很简单,但我花了 2 天时间来到这里。谢谢! 我也不同意这是“容易解决”,但感谢您的回答,因为它也为我节省了一点时间。 在通过 NuGet 更新或添加包时发生这种情况时,请参阅下面的答案以解决一般情况。您可以从 NuGet 包管理器控制台运行单行命令“Add-BindingRedirect”,这使得解决问题变得非常容易。 虽然我并不是要同意或不同意以前的任何 cmets,但在尝试了所有建议的选项后,我仍然收到最初的错误消息。我指的是 Microsoft.Data.Edm 版本 5.0.2.0; Microsoft.Data.OData 5.0.2.0 版和 System.Spatial 5.0.2.0 版;使用 NuGet 卸载并重新安装一些东西后,错误仍然存在,看起来与我使用的任何其他版本的参考文件无关。所以最后我仍然坚持这个问题,并寻找一个不是可能有效的解决方案,而是简单有效的解决方案!有这么多要问的吗? @astaykov - 看看这个问题自发布以来被查看的次数,以及收到的 cmets,我认为可以说你们这里有潜在的“刺”需要查看。这令人沮丧,并在社区中引起了很多挫败感。我不在乎装配绑定已经存在了很长时间。一个简单的事实是,现在随着 NuGet 时代,这需要重新审视并修复。【参考方案2】:我有一个非常相似的问题,但在这种情况下它的异常消息是;
无法加载文件或程序集 'Microsoft.Data.OData, 版本=5.5.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 或 它的依赖项之一。定位程序集的清单定义 与程序集引用不匹配。 (HRESULT 的例外情况: 0x80131040)
注意它正在尝试加载 OData 程序集的 v5.5.0.0。
在研究了 ILSpy (http://www.ilspy.net) 之后,我发现 Microsoft.WindowsAzure.Storage 2.0.0.0 明确引用了 Microsoft.Data.OData 5.2.0.0 - 因为我的版本是 5.5.0.0,所以我没有.
所以解决方案是使用 NuGet 包管理器卸载 Microsoft.WindowsAzure.Storage,这反过来又卸载了 Microsoft.Data.OData 5.5。然后再次使用 NuGet 包管理器,重新安装 Microsoft.WindowsAzure.Storage,它确定它需要 Microsoft.Data.OData 5.2 并安装它。
然后回到可行的解决方案。
【讨论】:
谢谢你,我遇到了同样的问题。你拯救了我的周末! 在 MSBuild 中解决二进制文件的方式存在问题,可能导致此错误。正如您所发现的,除了创建手动复制 DLL 的构建后事件之外,有时唯一的解决方案是简单地保持预期的版本依赖性。问题与 MSBuild 的统一引擎有关。 由于这个解决方案不涉及任何配置文件的编辑,只是稍微烦人的 nuget 卸载和重新安装。很遗憾,答案排名没有更高。【参考方案3】:当您通过 NuGet 更新包或添加新包并最终出现“无法加载文件或程序集...”问题时,您通常可以解决此问题。
打开包管理器控制台(VS 2012 工具/库包管理器/包管理器控制台)。一旦打开包管理器控制台的外壳,运行命令:
添加绑定重定向
注意:请注意,NugGet 示例在其示例的末尾添加了一个“s”,Add-BindingRedirect
不是有效命令。
执行以下操作:
检查项目输出路径中的所有程序集并添加 绑定重定向到应用程序配置 (app.config) 文件 或到需要的 Web 配置 (web.config) 文件。
您可以在以下位置查看包管理器控制台的完整文档:http://nuget.codeplex.com/wikipage?title=Package%20Manager%20Console%20Command%20Reference%20(v1.3)
除了您在 astaykov 的回答中看到的两个条目之外,还为我的项目添加了以下条目。
<dependentAssembly>
<assemblyIdentity name="System.Spatial" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
</dependentAssembly>
【讨论】:
我没有投票给你,但我可以想象人们为什么这样做:虽然你的解决方案应该有效,但当我尝试它时,该命令似乎没有任何影响。手动添加重定向(如 astaykov 的回答)似乎更可靠,但当然也有缺点,即需要完全正确地获取版本并在新的 OData 版本上手动更新。 有趣。我确实运行了它并验证了我的 web.config 文件中插入的文本。除非它确实有效(至少它对我有用),否则我不会将其添加为答案。奇怪但并不奇怪,它对您的文件没有任何影响。你有 web.config 或 app.config 文件吗? 也许您必须在包管理器控制台中选择正确的“默认项目”才能使其正常工作?就像你必须为 Install-Package 做的一样Add-BindingRedirect
在较新版本的 NuGet 中不存在。
我被困了很长时间,这有助于/解决了这个问题(我会给予更多的支持) - 有效!【参考方案4】:
我今天遇到了类似的问题。我发现的唯一区别是我的云应用在 Version=5.2.0.0
中查找(但未能找到)Microsoft.Data.OData使用 Visual Studio 对象浏览器,我发现我的解决方案使用了该位置的库:
C:\Program Files (x86)\Microsoft WCF Data Services\5.0\bin\.NETFramework
驻留在那里的 Microsoft.Data.OData 库在版本中。 5.0.0.0 所以用 5.2.0.0 覆盖它解决了问题。
附:我之前为 Windows 应用商店应用程序安装了 WCF 数据服务工具,希望能解决这个问题,因此您的应用程序可能会从其他来源获取它。如果是这种情况,您有两种选择:
从here 安装适用于 Windows 应用商店应用的 WCF 数据服务工具并使用上述解决方案。
使用 Visual Studio 对象浏览器查找当前对您的项目可见的 OData 库版本以及它们的存储位置。接下来,您需要覆盖它们的不正确版本。
【讨论】:
【参考方案5】:我也遇到了类似的问题,但我没有使用 Azure,并且没有指向 5.2 的硬编码参考。但它通过确保 .svc 中的文本指向正确的程序集来解决(在找到 this article 之后):
<%@ ServiceHost Language="C#"
Factory="System.Data.Services.DataServiceHostFactory,
Microsoft.Data.Services, Version=5.6.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Service="MVC4WCFDataServiceFE5.NorthWindService" %>
请注意我以前没有的 Version=5.6.0.0。
【讨论】:
以上是关于无法使用表存储在 Azure 云工作者角色中加载文件或程序集 Microsoft.Data.OData 版本 = 5.2.0.0 错误的主要内容,如果未能解决你的问题,请参考以下文章