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.
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.
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:
Vous voyez le problème n ° 1. Pour résoudre les deux problèmes, je vous recommande d’apporter les deux modifications suivantes:
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>
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.
System.Web.Mvc
et choisissez PropriétésTrue
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.
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. .
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!
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.