Подтвердить что ты не робот

Не удалось загрузить файл или сборку Ошибка Microsoft.Data.OData Версия = 5.2.0.0 в роли рабочего агента Azure с использованием хранилища таблиц

У меня очень странная проблема с использованием Azure Table Storage. У меня есть проект .NET 4.5 в Visual Studio 2012, где я занимаюсь всеми функциями хранилища таблиц Azure. На этот проект /dll ссылаются два других проекта: мой веб-сайт MVC и моя роль Azure Worker. (Я работаю под эмуляторами 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 Worker появится служба, которая будет читать запись.

Таким образом, обе используют одну и ту же DLL для хранения и извлечения, однако у моего проекта MVC нет проблем с сохранением записи, но в моей службе роли Azure Worker при попытке получить запись генерирует исключение при попытке выполнить "таблицу". 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​​li >
  • Я даже создал новый проект Cloud Service и WorkerRole с нуля, чтобы убедиться, что он не работает в текущем проекте WorkerRole.

Я не вернул dll обратно в 5.2, так как у меня было слишком много проблем в других проектах, где я использую функции, характерные для 5.3.

В настоящее время я запускаю всю dll на 5.5.

Когда я запустил утилиту 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

Как я это интерпретирую, это то, что dll Microsoft.WindowsAzure.Storage ссылается на V 5.2.0.0 dll Microsoft.Data.OData, но как я могу это исправить, если это проблема? Согласно документации, которую я видел в dll Storage, предполагается, что она должна ссылаться на 5.4 и выше, а не на 5.2...?

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Вопрос о выпуске для такой простой проблемы не поможет вам.

Поместите следующую конфигурацию дополнений в соответствующие файлы конфигурации (web.config для MVC и 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 будет обновляться с каждой новой версией каждой справочной библиотеки! Это было бы безумием...

Ответ 2

У меня была очень похожая проблема, но в этом случае это сообщение об ошибке было:

Не удалось загрузить файл или сборку 'Microsoft.Data.OData, Версия = 5.5.0.0, Культура = нейтраль, PublicKeyToken = 31bf3856ad364e35 'или одной из его зависимостей. Установленное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Заметьте, что он пытался загрузить v5.5.0.0 сборки OData.

После некоторых поисков с помощью 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, этот inturn удалил Microsoft.Data.OData 5.5. Затем снова с помощью диспетчера пакетов NuGet переустановите Microsoft.WindowsAzure.Storage, который определил, что ему нужен файл Microsoft.Data.OData 5.2 и он тоже установлен.

и вернуться к рабочему решению.

Ответ 3

Вы можете решить эту проблему в общем случае, когда вы обновляете пакеты или добавляете новые пакеты через NuGet, и в итоге возникают проблемы "Не могу загрузить файл или сборку...".

Откройте Консоль диспетчера пакетов (VS 2012 Tools/Library Package Manager/Консоль диспетчера пакетов). После открытия оболочки для консоли диспетчера пакетов выполните команду:

Add-BindingRedirect

Примечание. Будьте осторожны, так как пример NugGet добавил 's' в конец в своем примере и Add-BindingRedirect не является допустимой командой.

Это делает следующее:

Изучает все сборки в пути вывода для проекта и добавляет привязка перенаправлений к файлу конфигурации приложения (app.config) или в файл конфигурации сети (web.config), где это необходимо.

Вы можете просмотреть полную документацию для консоли диспетчера пакетов по адресу: http://nuget.codeplex.com/wikipage?title=Package%20Manager%20Console%20Command%20Reference%20(v1.3)

В дополнение к двум записям, которые вы видите в ответе астайков, в мой проект также добавлено следующее.

  <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>

Ответ 4

У меня была аналогичная проблема сегодня. Единственное различие, которое я обнаружил, - это облачное приложение, которое (и не удается найти) для Microsoft.Data.OData в версии = 5.2.0.0

Используя Visual Studio Object Browser, я узнал, что мое решение использовало библиотеку из этого места:

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. Ранее я устанавливал инструменты служб данных WCF для приложений Windows Store в надежде на решение этой проблемы, поэтому может случиться так, что ваше приложение получит его из другого источника. Если это так, у вас есть два варианта:

  • Установите инструменты службы данных WCF для приложений Windows Store из здесь и используйте вышеприведенное решение.

  • Используйте Visual Object Object Browser, чтобы узнать, какие версии библиотеки OData в настоящее время видны для вашего проекта и где они хранятся. Затем вам нужно будет перезаписать неправильные версии.

Ответ 5

У меня была аналогичная проблема, но я не использовал Azure и не было жестко закодированной ссылки, указывающей на 5.2. Но он решил (после нахождения этой статьи), убедившись, что текст в .svc указал на правильную сборку:

<%@ ServiceHost Language="C#"
      Factory="System.Data.Services.DataServiceHostFactory,
      Microsoft.Data.Services, Version=5.6.0.0,
      Culture=neutral, PublicKeyToken=31bf3856ad364e35"

Сервис = "MVC4WCFDataServiceFE5.NorthWindService" % >

Обратите внимание на Версия = 5.6.0.0, чего у меня раньше не было.