web-dev-qa-db-fra.com

Après la mise à jour Windows "Le nom de type ou d'espace de nom 'Html' n'existe pas dans l'espace de nom 'System.Web.Mvc'"

J'ai fait une mise à jour Windows et ensuite mon application asp.net mvc 5 ne se charge plus de se plaindre

CS0234: The type or namespace name 'Html' does not exist in the namespace 'System.Web.Mvc'

indiquant que mon point de vue est web.config

  <system.web.webPages.razor>
    <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Ogre.Extensions" />
        <add namespace="Newtonsoft.Json"/>
      </namespaces>
    </pages>
  </system.web.webPages.razor>

Maintenant, c'est très déroutant. Dans mon projet lui-même, je peux voir le nom de l'espace Html et ouvrir mon assembly dans ILSpy. Je peux naviguer jusqu'à la borne System.Web.Mvc. Je le peux aussi, et le journal de fusion ne montre aucune liaison suspecte. les erreurs.

C'est comme si seulement mes vues sont liées (avec succès) à une ancienne version de Mvc. Pourquoi cela arriverait-il? Comment puis-je le réparer?

Laissez-moi être clair qu'il n'y a eu aucune configuration ou même des changements de code. Tout cela est sur ma machine de développement sur IISExpress. Il était en cours d'exécution, j'ai fait la mise à jour et redémarré et maintenant, il ne fonctionne plus.

Voici mes installations récentes de la mise à jour. Je pourrais commencer à les supprimer un par un, mais je veux savoir ce qui ne va pas car je sens qu'il me manque une partie de l'histoire.

Installs from the update

66
George Mauer

Bon sang, merci à @ Nevada-Williford pour le conseil. Entrer et régler mes System.Web.Mvc référence à <Private>True</Private> (Copier Local = True) l'a corrigé. Notez qu'avant la mise à jour tout fonctionnait, après la mise à jour, j'ai dû modifier mon csproj pour qu'il fonctionne à nouveau.

Théorie de travail sur ce qui se passe:

Copy Local = True et <Private>True</Private> était presque mais pas exactement, la même chose. Le premier était un paramètre Visual Studio, le dernier un paramètre msbuild. Si le paramètre msbuild était absent, le paramètre Visual Studio serait appliqué (tant que vous étiez dans VS). Dans cette mise à jour, je pense qu'ils l'ont changé si Copy Local ne reflète que l'attribut de présence.

Dans notre projet, cet attribut n'est pas défini explicitement, mais Copy Local = True donc avant la mise à jour System.Web.Mvc.dll est copié dans le répertoire bin. Après la mise à jour, l'attribut étant manquant, Copy Local affiche False et vous devez le définir sur True pour vous assurer de disposer d’une copie locale.

Réglage manuel Copy Local = True (ou l’ajout de cet élément XML à msbuild) corrige le problème.

Edit: Bien que cela semble être la réponse à une question spécifique, toute personne venant ici devrait lire le fil de discussion et les autres réponses, en particulier celle de dmatson, pour plus de contexte. , mises en garde et bugs associés.

117
George Mauer

Ceci était cassé pour tous les utilisateurs sans CopyLocal=true (ou, dans MSBuild, <Private>True</Private>) par MS14-059 . Les modèles MVC définissent <Private>True</Private> _ par défaut, mais si vous utilisez NuGet pour mettre à jour la version de MVC, vous perdez ce paramètre (voir bogue NuGet # 4344 ).

Le problème a deux aspects:

  1. Razor n'incluant pas de référence à MVC par défaut, sa compilation ne fonctionnera que si une version de MVC DLL existe dans votre dossier bin.
  2. Si vous déployez sur une machine distincte sur laquelle cette mise à jour n'est pas installée, MVC DLL n'est plus inclus dans votre sortie, donc MVC sera manquant.

Vous voyez le problème n ° 1. Pour résoudre les deux problèmes, je vous recommande d’apporter les deux modifications suivantes:

  1. Ajoutez la configuration suivante à Views\Web.config:

    <system.web>
      <compilation>
        <assemblies>
          <add Assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </assemblies>
      </compilation>
    </system.web>
    
  2. Ensemble CopyLocal=true dans l'interface utilisateur de VS pour la référence du projet, ou ajoutez manuellement la ligne suivante dans le Reference de votre fichier .csproj:

    <Private>True</Private>
    

Donc, votre référence complète devrait ressembler à ceci:

<Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>..\..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
</Reference>

Notez que NuGet supprimera le paramètre CopyLocal/Private si vous mettez à jour les packages ultérieurement. (Par exemple, si vous effectuez une mise à jour vers MVC 5.2 aujourd'hui). Si cette version de MVC est jamais GAC, le problème n ° 1 ci-dessus ne se reproduira pas tant que vous aurez ajouté la configuration à l'étape A ci-dessus, mais le problème n ° 2 pourrait toujours se reproduire. Pour éviter que cela ne se produise, nous vous recommandons de redéfinir manuellement CopyLocal sur true à chaque fois que vous effectuez une mise à jour du paquet NuGet.

32
dmatson
  1. Vous pouvez aller aux références du projet en cours.
  2. Clic droit dans dll System.Web.Mvc et choisissez Propriétés
  3. Une fenêtre de propriétés s'ouvrira
  4. Remplacez Copie locale par True
9
TuanDPH

La définition de CopyLocal = true n'a pas aidé. Nettoyer la solution puis la refermer et la rouvrir a de nouveau fonctionné. Vous devrez peut-être également fermer l'intégralité de l'instance de Visual Studio.

5
usefulBee

Cela semble avoir été provoqué par une mise à jour Windows ( KB2990942 ) pour corriger une vulnérabilité de sécurité MS14-059 , ce qui permettait le contournement des fonctions de sécurité. Nos versions ont cessé de fonctionner sur notre serveur de version après l'installation de Windows Update et la mise à jour des fichiers csproj pour qu'ils utilisent 4.0.0.1 pour la référence System.Web.Mvc a résolu le problème.

La description de cette vulnérabilité par Microsoft est la suivante:

Cette vulnérabilité pourrait permettre de contourner les fonctionnalités de sécurité si un attaquant persuadait un utilisateur de cliquer sur un lien spécialement conçu ou de visiter une page Web contenant un contenu spécialement conçu pour exploiter cette vulnérabilité. Dans le cas d'une attaque Web, un attaquant pourrait héberger un site Web spécialement conçu pour exploiter cette vulnérabilité via un navigateur Web, puis inciter un utilisateur à consulter ce site Web. L’attaquant pourrait également exploiter les sites Web compromis et les sites Web qui acceptent ou hébergent du contenu ou des publicités fournis par les utilisateurs. Ces sites Web pourraient contenir du contenu spécialement conçu pour exploiter cette vulnérabilité. Dans tous les cas, toutefois, un attaquant n'aurait aucun moyen de forcer les utilisateurs à afficher le contenu contrôlé par l'attaquant. Au lieu de cela, un attaquant devrait convaincre les utilisateurs de prendre des mesures, généralement en les incitant à cliquer sur un lien contenu dans un courrier électronique ou dans un message de messagerie instantanée qui les mènerait au site Web de l'attaquant, ou en leur demandant d'ouvrir une pièce jointe envoyée par courrier électronique. .

4
Nick Jones

En plus de définir CopyLocal = true dans la référence du projet, vous devrez peut-être également modifier le fichier Web.Config comme suit ...

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
  </dependentAssembly>

Notez la newVersion = "4.0.0.1". Cela a fonctionné pour moi et j'espère que cela aidera aussi quelques personnes.

Enregistre la mise à jour de la structure MVC sur tous les serveurs de test/production.

Cordialement Microsoft. Tu es le meilleur!

Votre tentative de me rendre incompétent devant mes clients a été déjouée encore une fois!

3
Hemslingo

En plus de mettre CopyLocal=true dans la référence du projet, vous devrez peut-être également modifier le fichier Web.Config comme suit ...

<dependentAssembly>
  <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
</dependentAssembly>

J'ai ajouté culture="neutral" aussi, et tout cela a résolu le problème.

1
Naro