13 votes

La redirection de la liaison d'assemblage ne fonctionne pas

J'essaie de déployer une application web de test sur Azure, mais lorsque j'exécute l'émulateur Azure sur ma machine locale, j'obtiens cette erreur dans la console de l'émulateur Azure attachée à mon WebRole :

System.TypeLoadException: Unable to load the role entry point due to the following     exceptions:
-- System.IO.FileLoadException: Could not load file or assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

=== Pre-bind state information ===
LOG: User = COLLAB\mirko.lugano
LOG: DisplayName = System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
(Fully-specified)
LOG: Appbase = file:///C:/Code/Application/<MyWebProject>.Azure/csx/Debug/roles/<MyWebProject>/approot/bin
LOG: Initial PrivatePath = C:\Code\Application\<MyWebProject>.Azure\csx\Debug\roles\<MyWebProject>\approot\bin
Calling assembly : ActionMailer.Net.Mvc, Version=0.7.4.0, Culture=neutral, PublicKeyToken=e62db3114c02a1c2.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Code\Application\<MyWebProject>.Azure\csx\Debug\roles\<MyWebProject>\base\x64\WaIISHost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Attempting download of new URL file:///C:/Code/Application/<MyWebProject>.Azure/csx/Debug/roles/<MyWebProject>/approot/bin/System.Web.Mvc.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

---> System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
  at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
  at System.Reflection.RuntimeModule.GetTypes()
  at System.Reflection.Assembly.GetTypes()
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly entryPointAssembly)
  --- End of inner exception stack trace ---
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(Assembly entryPointAssembly)
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(RoleType roleTypeEnum)
  at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum)
[fabric] Role state Unknown

Tout fonctionnait bien tant que MVC3 était installé sur ma machine locale (l'assemblage MVC3 était dans le GAC), mais depuis que j'ai supprimé MVC3 (Azure n'a pas MVC installé), j'obtiens cette erreur. Mon application web a MVC4 régulièrement inclus et cela fonctionne bien. J'avais alors pensé à la redirection de l'assembly binding, et j'ai remarqué que dans mon fichier web.config j'ai déjà :

  <runtime>    
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">      
    ...
    <dependentAssembly>        
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    ...
  </assemblyBinding>
</runtime>

ce qui devrait être déjà correct, d'après la documentation que j'ai lue sur Internet. J'ai également essayé de définir le paramètre Version spécifique propriété de mon System.Web.Mvc.dll ( version 4.0.0.0 ) à faux mais en vain. Est-ce que quelque chose m'échappe ? L'assemblage appelant ne devrait-il pas ActionMailer.Net.Mvc sera automatiquement redirigé vers la version correcte de l'assemblage MVC ? Toute idée est la bienvenue. Merci.

11voto

Dans les WebRoles Azure, par défaut (en mode IIS complet), le RoleEntryPoint est isolé du reste du WebRole et s'exécute dans un processus différent.

Un effet secondaire de ceci est que votre RoleEntryPoint n'aura pas accès à votre web.config .

  • Azure SDK 1.3 -1.7 se trouvera dans WaIISHost.exe.config

  • Le SDK Azure 1.8+ se trouvera dans la section WebRoleProjectName.dll.config .

Avec les dernières modifications apportées au SDK, vous devriez être en mesure de placer un fichier de type app.config dans votre projet et votre point d'entrée de rôle devrait alors y avoir accès.

Vous pouvez en savoir plus à ce sujet dans ce document de Microsoft article de blog ou dans ce Message sur Stackoverflow

5voto

Mirko Lugano Points 527

Merci Rune pour cette précieuse indication. Cela n'a pas résolu mon problème mais m'a orienté dans la bonne direction, car j'ai la dernière version du SDK Azure (1.8) et cette astuce WaIISHost.exe.config ne fonctionne plus sur la dernière version d'Azure. ICI est indiqué ce que je viens de dire et la solution qui a fonctionné pour moi, qui est de renommer le fichier WaIISHost.exe.config en MyWebAppName.dll.config (en le plaçant au même niveau que votre fichier web.config dans votre application web et en définissant sa propriété Copy to output Directory sur 'Copy Always'. Bien sûr, ce fichier de configuration contient la section de redirection de la liaison comme je l'ai décrit ci-dessus.

2voto

Piedone Points 1074

À partir d'aujourd'hui, avec la dernière version du SDK, un WebRoleProjectName.dll.config sera automatiquement généré pour vous avec le contenu du Web.config et copié dans le répertoire de sortie.

Cependant, cela ne sera pas automatiquement inclus dans le paquet de déploiement ! Pour que cela se produise, vous devez employer une solution un peu bricolée : inclure le fichier généré dans le projet en sélectionnant "show all files", puis en incluant uniquement ce fichier. Le changement résultant dans le csproj devrait ressembler à ceci (non, ne le sélectionnez pas pour être "Copy always" !):

<Content Include="bin\WebRoleProjectName.dll.config" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X