web-dev-qa-db-fra.com

Migration de mon application MVC 3 vers MVC 4

Je ne sais vraiment pas quoi faire, je suis cet article qui montre comment migrer manuellement mon application MVC 3. 

J'ai suivi toutes les étapes mais l'erreur suivante apparaît lors de l'exécution de l'application:

Erreur serveur dans l'application '/'.

Impossible de charger le fichier ou l'assembly 'System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35' ou Une de ses dépendances. La définition manifeste De l'Assemblée localisée ne correspond pas à la référence de l'Assemblée. (Exception de HRESULT: 0x80131040)

Description: une exception non gérée s'est produite lors de l'exécution de De la demande Web en cours. Consultez la trace de la pile pour plus d’informations Sur l’erreur et son origine dans le code. 

Détails des exceptions: System.IO.FileLoadException: impossible de charger le fichier ou Assembly 'System.Web.WebPages.Razor, version = 1.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35' ou un. de ses dépendances. La définition du manifeste de l'Assemblée Localisée ne correspond pas à la référence De l'Assemblée. (Exception de HRESULT: 0x80131040)

Erreur de source: 

Une exception non gérée a été générée lors de l'exécution de la demande Web actuelle . Les informations concernant l'origine et l'emplacement de L'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions ci-dessous.

Suivi de la charge d'assemblage: Les informations suivantes peuvent être utiles pour Déterminer pourquoi l'assembly 'System.Web.WebPage.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35'. ____.] n'a pas pu être chargé.

WRN: la journalisation de la liaison d'assemblage est désactivée. Pour activer la journalisation des échecs d'assemblage avec Assembly , Définissez la valeur de registre [HKLM\Software\Microsoft\Fusion! EnableLog] (DWORD) sur 1. Remarque: Il y a un risque de perte de performances. associé à la journalisation d'un échec d'assemblage . Pour désactiver cette fonctionnalité, supprimez la valeur de registre [HKLM\Software\Microsoft\Fusion! EnableLog].

Trace de la pile: 

[FileLoadException: impossible de charger le fichier ou l'assembly 'System.Web.WebPages.Razor, version = 1.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35' ou une de ses dépendances. La définition du manifeste de l'Assemblée Localisée ne correspond pas à la référence De l'Assemblée. (Exception de HRESULT: 0x80131040)]
Microsoft.Web.Samples.PreApplicationStartCode.Start () +0

[InvalidOperationException: la méthode d'initialisation du démarrage pré-application Démarrez à l'aide du type Microsoft.Web.Samples.PreApplicationStartCode A lancé une exception avec le message d'erreur suivant: Impossible de charger le fichier Ou l'assembly. 'System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35' ou l'une de ses dépendances . La définition du manifeste de l’Assemblée localisée ne correspond pas À la référence de l’Assemblée. (Exception de HRESULT: 0x80131040).]
System.Web.Compilation.BuildManager.InvokePreStartInitMethods (méthodes ICollection`1 ) +423
System.Web.Compilation.BuildManager.CallPreStartInitMethods () +306
System.Web.Hosting.HostingEnvironment.Initialize (ApplicationManager AppManager, IApplicationHost appHost, IConfigMapPathFactory .

[HttpException (0x80004005): La méthode d'initialisation de démarrage pré-application Démarrez sur le type Microsoft.Web.Samples.PreApplicationStartCode A lancé une exception avec le message d'erreur suivant: Impossible de charger fichier ou Assembly 'System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35' ou une de ses dépendances . La définition du manifeste de l’Assemblée localisée ne correspond pas À la référence de l’Assemblée. (Exception de HRESULT: 0x80131040).]
System.Web.HttpRuntime.FirstRequestInit (contexte HttpContext) +9079340 System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext context) +97 [.____. wr, contexte HttpContext) +256

Informations de version: Microsoft .NET Version: 4.0.30319; ASP.NET Version: 4.0.30319.237

J'ai parcouru le code, mais je ne vois aucune référence à System.Web.WebPages.Razor dans la version 1.0 version 2.0 uniquement.

21
ridermansb

Utilisez NuGet et ajoutez le package Microsoft.AspNet.Mvc (Microsoft Asp.Net Mvc 4). Cela devrait mettre à jour vos références. Voir:

https://nuget.org/packages/Microsoft.AspNet.Mvc

Vous aurez besoin de mettre à niveau les références d'assembly dans votre web.config.

Supprimer de la racine web.config:

<assemblies>
  <add Assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add Assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add Assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>

Ajouter à la racine web.config:

<runtime>
  <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Views/Web.Config:

Changez Razor de 1.0.0.0 à 2.0.0.0:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="Host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

<Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

<pages validateRequest="false"
       pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add Assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>
36
Oliver

Avez-vous oublié de mettre à jour les références dans Views\Web.Config? Les références qu'il contient servent à créer les pages de vue.

2
jgauffin

J'ai supposé que vous possédiez une application Web intranet MVC3. Lors de la mise à niveau de MVC3 à MVC4 à l'aide de NuGet, votre application fait désormais référence à System.Web.WebPages.Razor version 2.0.0.0, PAS à System.Web.WebPages.Razor version 1.0.0.0. Voici ma façon de résoudre la référence.

Il y a deux endroits à réparer:

  1. Dans la racine web.config, 

    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        . . .
        <add Assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        . . .
      </assemblies>
    </compilation>
    

change Version = 1 . 0.0.0 en Version = 2 . 0.0.0

Donc, votre nouvelle référence ressemblera à ceci:

    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        . . .
        <add Assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        . . .
      </assemblies>
    </compilation>
  1. Dans le dossier Vues , il y a un fichier web.config. En inspectant ce fichier, vous verrez qu'il fait référence à la version 1. Remplacez le fichier web.config entier du dossier Views par un nouveau fichier web.config . Faites une sauvegarde de l'ancien fichier web.config, au cas où. Pour obtenir un tout nouveau fichier web.config pour le dossier Vues, ​​vous créez une nouvelle application MVC4 pour intranet. Allez dans le dossier Vues. Copiez le fichier Web.Config à partir du dossier Vues de la nouvelle application dans le dossier Vues de l'application endommagée.

J'espère que ça aide!

2
DQ Vu

Dans le monde entier, avez-vous recherché System.Web.WebPages.Razor, Version = 1.0.0.0 dans votre solution? Faites-vous toujours référence à System.Web.WebPages.Razor (version 1.0.0.0)? Faites-vous référence à System.Web.WebPages.Razor Version 2.0.0.0?


[Mise à jour] J'ai finalement rencontré le même problème. Il semble que l'un des packages NuGet que j'ai installé et désinstallé n'ait pas entièrement supprimé la référence à System.Web.Razor utilisée. Nettoyer la solution n'a pas aidé car la DLL n'a pas été utilisée directement par l'application Web. Je l’ai enfin obtenu en supprimant manuellement l’ensemble du répertoire bin ...

1
Marius Schulz

Réinstaller les packages AspNetSprite comme suggéré ci-dessus ne résout pas le problème pour moi. Mais l’ajout de ces lignes à la section runtime\assemblyBinding du fichier racine web.config fonctionne:

    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
1
Ghislain Proulx

Vérifiez le fichier web.config dans votre dossier de vues.

METTRE À JOUR:

Ce morceau semble suspect.

Microsoft.Web.Samples.PreApplicationStartCode

Faites-vous référence à des exemples de bibliothèques d’applications, comme les futures MVC ou quelque chose du genre? 

0
Erik Funkenbusch

Mon application a utilisé un package tiers, AspNetSprites-MvcAndRazorHelper. Réinstallé ce paquet et l'erreur de la référence a été corrigée.

0
ridermansb

C’est un autre paquet Nuget que vous pouvez utiliser pour mettre à niveau mvc 3 vers mvc 4 https://nuget.org/packages/UpgradeMvc3ToMvc4

0
Mahesh

c'est très simple, lorsque vous mettez à jour vers MVC 4.0.0.0, mais que la configuration Web de la solution pointe toujours sur MVC 3.0.0.0.0. , il vous suffit donc de remplacer MVC version 3.0.0.0.0. par 4.0.0.0.0

Faites de même avec les autres assemblys, pour vérifier la version de Assembly, vérifiez les propriétés de l’Assembly respectif dans les références de votre projet.

0
Surya C