Я в конце концов. Visual Studio, как правило, мучительно медленно отлаживает или просто загружает («запускает без отладки») мои сайты ASP.NET MVC. Не всегда: сначала проекты загружаются красиво и быстро, но как только они загружаются медленно, после этого они всегда будут загружаться медленно. Я мог ждать 1-2 минуты или больше.
Моя настройка:
В настоящее время я использую Visual Studio 2012 Express , но у меня была такая же проблема и в Visual Studio 2010 Express. Мое решение хранится на сетевом диске; в частности, это мои документы, перенаправленные на сетевой диск, если это имеет значение. (Это не должно быть. В некоторых случаях мой сайт загружается очень быстро при такой настройке.)
Обычно я загружаю в Internet Explorer 9, но та же проблема возникает в Firefox.
Это может произойти в любом проекте ASP.NET MVC, над которым я работаю, и, кажется, вращается вокруг наличия DisplayTemplates, что делают все мои проекты ASP.NET MVC. И это все C # и Razor, если это имеет значение.
Симптомы:
Система будет загружать мои символы сотни раз. По существу, следующее, но есть как минимум 300 таких строк, каждая из которых имеет несколько отличающиеся файлы DLL для одного и того же CSHTML:
'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.
В приведенном выше у меня есть три DisplayTemplates: «Контакт», «Расположение» и «StatusCode». Похоже, что IIS загружает символы дважды каждый раз, когда вызывается шаблон отображения. Таким образом, если я отображаю таблицу из 100 записей, которая вызывает все три из этих шаблонов отображения, то загружается 600 отдельных символов.
Это тоже не быстрая операция. Просматривая файлы журнала, которые генерирует IIS, для загрузки каждого символа требуется около 200 мс. Таким образом, супер-длинные задержки.
Что я пробовал:
- Отладка или выпуск версии, это не имеет значения.
- Помещение моего проекта на полную реализацию IIS на веб-сервере запускает его очень быстро, без проблем.
- Cassini, IIS Express 7.5 и IIS Express 8.0 имеют проблемы.
- Удалить все точки останова ничего не делает.
- Чистый раствор или удаление .suo тоже ничего не делают.
- Если я восстановлю IIS Express, или удалю
My Docs\IISExpress
папку, или восстановлю / переустановлю Visual Studio → проблема МОЖЕТ исчезнуть, но только на некоторое время, прежде чем она вернется обратно.
Любой совет вообще приветствуется.
Чтобы ответить на дополнительные вопросы, да, моя машина определенно имеет мощность. Раздражает то, что один и тот же проект, НИЧЕГО не измененный, иногда может загружаться очень и очень быстро, обычно после того, как я чиню IIS Express и удаляю My Docs\IISExpress
папку. В конце концов «что-то» происходит, и до загрузки снова остается 2 минуты. То, над чем я работаю, не является сложным проектом. Никаких внешних библиотек или зависимостей, и мой VS.NET не имеет никаких надстроек вообще.
Следует отметить, что эта машина имеет Symantec Endpoint Protection, которая в прошлом вызывала хаос. Но прямое отключение (хорошо быть администратором) не решило проблему.
У меня есть теория на данный момент. Я думаю, что это все, потому что я работаю с перенаправленной папкой с сетевого ресурса. Пока отладчик просматривал сотни строк «загруженных символов», я остановился, чтобы посмотреть, что он делает. Это было в моем коде, загружая DisplayTemplate, который у меня был. Шагнув в шаблон, выведите это:
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'
Похоже, Visual Studio перекомпилирует мою displaytemplate каждый раз, когда он вызывается, что снова сотни раз. Моя теория заключается в том, что Visual Studio компилирует файл, сохраняет его на общем сетевом ресурсе, затем сетевой ресурс каким-то образом устанавливает новое время, и Visual Studio думает, что файл изменился, и, таким образом, Visual Studio перекомпилирует его снова. Только теория, хотя; Я действительно понятия не имею.
Например, у меня есть автономные файлы (это настольный компьютер в офисе; мне было все равно). Завтра я собираюсь отключить, перезагрузить компьютер и повторить попытку.
Плюс, перемещение моего проекта, как есть, в локальный C: исправляет это. Он загружается очень быстро. Но это не идеально в рабочей среде. Я теряю предыдущие версии, мой код не копируется вообще, если я не копирую его вручную, и он больше никому не передается.
Я могу обойтись копированием его назад и вперед из C на общий сетевой ресурс, если это произойдет. Гораздо неприятнее ждать две минуты для каждой загрузки страницы.