无法使用表存储在Azure Cloud Worker角色中加载文件或程序集Microsoft.Data.OData Version = 5.2.0.0错误

时间:2013-06-04 01:24:11

标签: c azure azure-storage azure-table-storage

我使用Azure表存储有一个非常特殊的问题。我在Visual Studio 2012中有一个.NET 4.5项目,我处理所有Azure表存储功能。这个项目/ dll由另外两个项目引用,我的MVC网站和我的Azure工作者角色。 (我在我的机器上的Azure仿真器下运行,但是当我将它部署到云时也会发生这种情况)

我保存或检索记录时调用了以下函数:

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工作者角色中有一个将读取记录的服务。

因此,两者都使用相同的dll进行存储和检索,但是我的MVC项目在保存记录时没有问题,但是当我尝试检索记录时,我的Azure Worker角色服务在尝试执行“table”时抛出异常。 CreateIfNotExists();”

  

无法加载文件或程序集'Microsoft.Data.OData,   Version = 5.2.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或   其中一个依赖项。定位程序集的清单定义   与装配参考不匹配。 (HRESULT的例外情况:   0x80131040)

我已经完成了以下工作:

  1. 将解决方案级别的所有NuGet软件包更新为最新版本
  2. 我浏览了每个项目参考,以确保没有旧的dll或以前的版本,特别是System.Spatial,Microsoft.WindowsAzure.Configuration,Microsoft.WindowsAzure.ServiceRuntime和Microsoft.ServiceBus,Microsoft.WindowsAzure .Storage,Microsoft.Data.Edm& Microsoft.Data.OData
  3. 我甚至从头开始创建了一个新的Cloud Service和WorkerRole项目,以确保它不会在当前的WorkerRole项目中被破坏。
  4. 我还没有把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 ......?

5 个答案:

答案 0 :(得分:38)

这样一个容易解决的问题的开放问题对你没有帮助。

将以下添加配置放在相应的配置文件中(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!这将是疯狂的......

答案 1 :(得分:16)

我有一个非常类似的问题,但在这种情况下,异常消息是;

  

无法加载文件或程序集'Microsoft.Data.OData,   Version = 5.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或   其中一个依赖项。定位程序集的清单定义   与装配参考不匹配。 (HRESULT的例外情况:   0x80131040)

请注意,它正在尝试加载OD5程序集的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并安装它。

并回到工作解决方案。

答案 2 :(得分:10)

每当您通过NuGet更新软件包或添加新软件包并最终导致“无法加载文件或程序集...”问题时,您通常可以解决此问题。

打开程序包管理器控制台 VS 2012工具/库程序包管理器/程序包管理器控制台)。打开包管理器控制台的shell后,运行命令:

添加-BindingRedirect

注意:请注意,因为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>

答案 3 :(得分:1)

我今天遇到过类似的问题。我发现的唯一区别是我的云应用程序在版本= 5.2.0.0

中查找(并且未能找到)Microsoft.Data.OData

使用Visual Studio对象浏览器我发现我的解决方案使用了该位置的库:

  

C:\ Program Files(x86)\ Microsoft WCF Data Services \ 5.0 \ bin \ .NETFramework

驻留在那里的Microsoft.Data.OData库是ver。 5.0.0.0 所以用 5.2.0.0 覆盖它解决了这个问题。

P.S。我之前为Windows Store应用程序安装了WCF数据服务工具,希望能够解决此问题,因此您的应用程序可能会从其他来源获取它。如果是这种情况,您有两种选择:

  1. here安装适用于Windows应用商店应用的WCF数据服务工具并使用上述解决方案。

  2. 使用Visual Studio对象浏览器查找项目当前可见的OData库版本及其存储位置。接下来,您需要覆盖它们的不正确版本。

答案 4 :(得分:0)

我也有类似的问题,但我没有使用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”%&gt;

请注意版本= 5.6.0.0 ,这是我之前没有的。