Azure не можа да намери препратка към EntityFramework

Моето приложение ASP.NET MVC 4 работи перфектно на IIS и в IEExpress Environment. За съжаление изглежда има проблем с различни версии на 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 използва файл 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