Azure не удалось найти ссылку на EntityFramework

Мое приложение ASP.NET MVC 4 отлично работает в IIS и в среде IEExpress. К сожалению, похоже, проблема с разными версиями EntityFramework. Все ссылки дважды и трижды проверяются на наличие EF 4.1.0.0. Все распевает EF 4.3.0.0 прямо сейчас. Где-то система, похоже, имеет ссылку на 4.1.0.0 и пытается ее найти. Без успеха.

Все связанные внешние библиотеки помечены как "copy local=true"

    Microsoft.WindowsAzure.ServiceRuntime Critical: 201 : Role entrypoint could not be created:
System.TypeLoadException: Unable to load the role entry point due to the following exceptions:
-- System.IO.FileLoadException: Die Datei oder Assembly "EntityFramework, Version=4.1.0.0,      Culture=neutral, PublicKeyToken=b77a5c561934e089" oder eine Abhängigkeit davon wurde nicht gefunden.     Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein. (Ausnahme von HRESULT: 0x80131040)
Dateiname: "EntityFramework, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

=== Zustandsinformationen vor Bindung ===
LOG: Benutzer = COREI7\markus
LOG: DisplayName = EntityFramework, Version=4.1.0.0, Culture=neutral,   PublicKeyToken=b77a5c561934e089
 (Fully-specified)
LOG: Appbase = file:///D:/Dev/TFS/BettrFit/BettrFit.Azure/csx/Debug/roles/BettrFit/approot/bin
LOG: Ursprünglicher PrivatePath =   D:\Dev\TFS\BettrFit\BettrFit.Azure\csx\Debug\roles\BettrFit\approot\bin
Aufruf von Assembly : System.Web.Http.Data.EntityFramework, Version=4.0.0.0, Culture=neutral,  PublicKeyToken=31bf3856ad364e35.
===
LOG: Diese Bindung startet im default-Load-Kontext.
LOG: Es wurde keine Anwendungskonfigurationsdatei gefunden.
LOG: Die Hostkonfigurationsdatei wird verwendet: 
LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework64\v4.0.30319 \config\machine.config wird verwendet.
LOG: Verweis nach der Richtlinie: EntityFramework, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
LOG: Download von neuem URL   file:///D:/Dev/TFS/BettrFit/BettrFit.Azure/csx/Debug/roles/BettrFit/approot/bin/EntityFramework.DLL.
WRN: Der Vergleich des Assemblynamens führte zum Konflikt: Nebenversion.
ERR: Das Setup der Assembly konnte nicht abgeschlossen werden (hr = 0x80131040). Die Suche wurde beendet.

 ---> System.Reflection.ReflectionTypeLoadException: Mindestens ein Typ in der Assembly kann  nicht geladen werden. Rufen Sie die LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen  benötigen.
   bei System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   bei System.Reflection.RuntimeModule.GetTypes()
   bei System.Reflection.Assembly.GetTypes()
   bei Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly    entryPointAssembly)
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly  entryPointAssembly)
   bei Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(RoleType roleTypeEnum)
   bei Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType    roleTypeEnum)
Das Programm "[2372] WaIISHost.exe: Verwaltet (v4.0.30319)" wurde mit Code -1 (0xffffffff) beendet.

Надеюсь, вы, ребята, могли бы дать несколько советов о том, как решить эту проблему.

Я исследовал сборку Data.EntityFramework:

Assembly a = System.Reflection.Assembly.Load("System.Web.Http.Data.EntityFramework, Version=4.0.0.0, Culture=neutral,  PublicKeyToken=31bf3856ad364e35");

foreach (AssemblyName i in a.GetReferencedAssemblies())
{
     Trace.TraceInformation("Ref Assemblies:" + i.Name+" "+i.Version);
}

Это показывает, что он зависит от EntityFramework 4.1.0.0 по умолчанию. Как я могу это изменить? Web.Config, кажется, не используется во время загрузки - здесь я уже пробовал перепривязку.


person Obiwan007    schedule 30.04.2012    source источник
comment
Вы также проверили косвенные ссылки, которые могут быть установлены локально (в вашем глобальном кэше сборок) и отсутствовать в Azure? Взгляните на stackoverflow.com/a/10142356/468244 + комментарии.   -  person Simon Opelt    schedule 30.04.2012
comment
Я проверил с помощью GACViewer - пока безрезультатно. Я подозреваю, что System.Web.Http.Entityframework может вызвать проблему. Но я понятия не имею, как проверить, на какую версию ссылается эта библиотека. В логе он называется Calling Assembly. Как я могу настроить его для использования более новой версии, поскольку она развернута с пакетом?   -  person Obiwan007    schedule 30.04.2012


Ответы (2)


Я исправил это, предоставив файл app.config с моим проектом веб-роли. Похоже, что Azure Startup-Code использует файл App.Config вместо обычно используемого Web.Config.

Мой app.config добавляет код привязки перенаправления runtime/assemplyreferences.

person Obiwan007    schedule 02.05.2012

Попробуйте использовать перенаправление сборки для перенаправления 4.1.0.0 на 4.3.0.0:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="4.0.0.0 - 4.2.0.0" newVersion="4.3.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

С уважением,

Мин Сюй.

person Ming Xu - MSFT    schedule 01.05.2012
comment
Извиняюсь. мой web.config уже содержал такой редирект. Пробовал и твой - не повезло. Похоже, что система игнорирует раздел времени выполнения web.config. - person Obiwan007; 01.05.2012