Ich bin am Ende. Visual Studio ist in der Regel sehr langsam beim Debuggen oder beim einfachen Laden ("Starten ohne Debuggen") meiner ASP.NET MVC-Sites. Nicht immer: Zuerst werden die Projekte schön und schnell geladen, aber sobald sie langsam geladen werden, werden sie danach immer langsam geladen. Ich könnte 1-2 Minuten oder länger warten.
Mein Setup:
Derzeit verwende ich Visual Studio 2012 Express , aber ich hatte das gleiche Problem auch in Visual Studio 2010 Express. Meine Lösung ist auf einem Netzlaufwerk gespeichert. Insbesondere handelt es sich um Eigene Dateien, die auf ein Netzlaufwerk umgeleitet werden, wenn dies von Bedeutung ist. (Sollte es nicht sein. Es gibt Zeiten, in denen meine Site unter diesem Setup sehr schnell geladen wird.)
Ich lade normalerweise in Internet Explorer 9, aber das gleiche Problem tritt in Firefox auf.
Dies kann in jedem ASP.NET MVC-Projekt passieren, an dem ich arbeite, und es scheint sich um DisplayTemplates zu drehen, wie es alle meine ASP.NET MVC-Projekte tun. Und es ist alles C # und Razor, wenn das wichtig ist.
Symptome:
Das System lädt meine Symbole hunderte Male. Grundsätzlich die folgenden, aber es gibt mindestens 300 solcher Zeilen mit jeweils geringfügig unterschiedlichen DLL-Dateien für die gleichen CSHTMLs:
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.xighmhow.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.cv5hktkf.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.1o77hs8i.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.jja-77mw.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.l_e9ev_s.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.b4n59gom.dll', Symbols loaded.
Oben habe ich drei DisplayTemplates: "Kontakt", "Standort" und "Statuscode". Es scheint, dass IIS bei jedem Aufruf der Anzeigevorlage zweimal Symbole lädt. Wenn ich also eine Tabelle mit 100 Einträgen anzeige, die alle drei dieser Anzeigevorlagen aufruft, werden 600 separate Symbole geladen.
Dies ist auch keine schnelle Operation. In den von IIS generierten Protokolldateien dauert es ungefähr 200 ms, bis jedes Symbol geladen ist. Somit superlange Verzögerungen.
Was ich versucht habe:
- Debug- oder Release-Version spielt keine Rolle.
- Wenn Sie mein Projekt auf einem Webserver auf eine vollständige IIS-Implementierung setzen, läuft es superschnell und ohne Probleme.
- Cassini, IIS Express 7.5 und IIS Express 8.0 haben alle das Problem.
- Alle Haltepunkte löschen bewirkt nichts.
- Clean Solution oder das Löschen der .suo-Datei tun ebenfalls nichts.
- Wenn ich IIS Express repariere oder den
My Docs\IISExpress
Ordner lösche oder Visual Studio repariere / neu installiere → Das Problem kann verschwinden, aber nur für eine Weile, bevor es sofort wieder auftritt.
Jeder Rat wird geschätzt.
Um weitere Fragen zu beantworten: Ja, meine Maschine hat definitiv die Leistung. Das Wütende ist, dass dasselbe Projekt, bei dem NICHTS geändert wurde, manchmal sehr schnell geladen werden kann, normalerweise nachdem ich IIS Express repariert und den My Docs\IISExpress
Ordner gelöscht habe . Schließlich passiert "etwas" und es dauert nur 2 Minuten, um es erneut zu laden. Woran ich arbeite, ist kein kompliziertes Projekt. Keine externen Bibliotheken oder Abhängigkeiten, und mein VS.NET hat überhaupt keine Addons.
Zu beachten ist, dass dieses Gerät über Symantec Endpoint Protection verfügt, das in der Vergangenheit Chaos verursacht hat. Das vollständige Deaktivieren (es ist gut, Administrator zu sein) hat das Problem jedoch nicht behoben.
Ich habe an dieser Stelle eine Theorie. Ich denke, das ist alles, weil ich an einem umgeleiteten Ordner von einer Netzwerkfreigabe arbeite. Während der Debugger seine Hunderte von "geladenen Symbolen" durchlief, hielt ich inne, um zu sehen, was er tat. Es war in meinem Code und lud die DisplayTemplate, die ich hatte. Beim Betreten der Vorlage wird Folgendes ausgegeben:
Step into: Stepping over non-user code 'System.Threading.WaitHandle.InternalWaitOne'
Step into: Stepping over non-user code 'System.Threading.WaitHandle.WaitOne'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCapture'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromFileBatch'
Step into: Stepping over non-user code 'System.Web.Compilation.AssemblyBuilder.Compile'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.bciuyg14.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.CompileWebFile'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultInternal'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.Find'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.Html.TemplateHelpers.ActionCacheViewItem.Execute'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.kwj3uqan.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.RuntimeType.CreateInstanceSlow'
Step into: Stepping over non-user code 'System.Web.Mvc.DependencyResolver.DefaultDependencyResolver.GetService'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerViewEngine.DefaultViewPageActivator.Create'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerCompiledView.Render'
Es sieht so aus, als würde Visual Studio meine Anzeigevorlage jedes Mal neu kompilieren, wenn sie aufgerufen wird, was wiederum hunderte Male der Fall ist. Meine Theorie ist, dass Visual Studio die Datei kompiliert, auf der Netzwerkfreigabe speichert, die Netzwerkfreigabe dann irgendwie eine neue Zeit darauf stempelt und Visual Studio dann denkt, dass sich die Datei geändert hat und Visual Studio sie daher erneut kompiliert. Nur eine Theorie; Ich habe wirklich keine Ahnung.
Zum einen habe ich anscheinend Offline-Dateien (dies ist ein Desktop-Computer in einem Büro; es könnte mich nicht weniger interessieren). Ich werde morgen deaktivieren, neu starten und es erneut versuchen.
Wenn Sie mein Projekt so wie es ist auf das lokale C: verschieben, wird es behoben. Es wird sehr schnell geladen. Dies ist jedoch in einer Arbeitsumgebung nicht ideal. Ich verliere frühere Versionen, mein Code wird nur dann gesichert, wenn ich ihn manuell kopiere, und er wird nicht mehr an Dritte weitergegeben.
Ich kann damit auskommen, es von C auf die Netzwerkfreigabe hin und her zu kopieren, wenn es darum geht. Es ist viel ärgerlicher, zwei Minuten auf jedes Laden der Seite zu warten.