2017-02-23 106 views
8

У меня есть проект ASP MVC 4. Он запускался как MVC 1, поэтому он использует представления ASPX/ASCX в старом стиле. Я хочу, чтобы представления компилировались во время сборки, в основном для проверки ошибок времени компиляции (а также, что важно, чтобы ошибки отображались непосредственно в Visual Studio). Я разрабатываю Visual Studio Pro 2015 с использованием IIS Express в качестве сервера отладки.Ошибка при попытке создания ASP MVC Просмотров во время сборки

Согласно как msdn, Haacked и вопросы здесь, такие как this я поставил следующий мой .vbproj:

<MvcBuildViews>true</MvcBuildViews> 

, а также в моей .vbproj создали задачу

<Target Name="BuildViews" Condition="'$(MvcBuildViews)'=='true'" AfterTargets="Build"> 
    <Message Importance="normal" Text="Precompiling views" /> 
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
</Target> 

Однако, что дает мне ошибку при попытке построить:

'/ temp' не является действительным приложением IIS.

В файле он просто ссылается ASPNETCOMPILER

Я пробовал различные варианты, как виртуальный_пути - Я проект настроен для работы в качестве поддиректории в разработчике /локальную поэтому я попробовал это, а имена сайтов из конфигурации в .vs-папке и ничего не работает.

Должен ли я изменить VirtualPath (и если да, к чему), или есть какая-то другая конфигурация отсутствует для темпа работать?

Редактировать

Кроме того, я получаю ту же ошибку запуска командной строки MSBuild. Для моих реальных производственных систем у меня есть скрипт, который выполняет сборку с использованием командной строки MSBuild, затем перемещает встроенный пакет на серверы продуктов и развертывает. Таким образом, когда он не будет создан, IIS express (или IIS работает) не будет. Вам нужен веб-сервер, связанный только для компиляции представлений?

Edit 2

Я смущен необходимостью для virtulPath здесь и очевидной связи с веб-сервером. Некоторые из предлагаемых решений включают настройку IIS. IIS Express (который я использую для отладки) даже не обязательно работает до после успешной сборки, как я ее понимаю? Во всяком случае, мое приложение работает в виртуальном каталоге довольно счастливо (/local в режиме отладки), но использование этого как значения не работает. Если это имеет значение, это соответствующая часть ApplicationHost.config в папке .vs в моем проекте (я пытался ставить одни и те же пути в applciationhost.config в документах/IIS Express):

<site name="CarWeb-Site" id="2"> 
    <application path="/" applicationPool="Clr4IntegratedAppPool"> 
     <virtualDirectory path="/" physicalPath="C:\Users\adam.conway\Documents\My Web Sites\CarWeb-Site" /> 
    </application> 
    <application path="/local" applicationPool="Clr4IntegratedAppPool"> 
     <virtualDirectory path="/" physicalPath="filesystem path to my project" /> 
    </application> 
    <bindings> 
     <binding protocol="http" bindingInformation="*:57047:localhost" /> 
     <binding protocol="http" bindingInformation="*:57047:*" /> 
    </bindings> 
</site> 

Я действительно не понимаю, почему просто VirtualPath="/" не работает, так как это виртуальный путь, указанный в этих конфигурациях.

В то время как моя основная цель заключается в том, чтобы показывать ошибки в Visual Studio (и я согласен с ответом, ограниченным этим), это также случай, который я создаю для производственных сред с использованием MSBuild на машине, которая не обязательно IIS.

+0

Создать каталог Temp в вашем решении с доступом для записи в процессе Dotnet. При создании проекта он создает временные файлы, и по ошибке он не может найти временный каталог/виртуальный путь. Как только он обнаружит, что есть доступ для записи, есть или нет. Надеюсь это поможет! – Amit

+0

@Amit: Не работает. Пробовал. Не прося виртуальный путь. То есть как-то относительно URL-адреса? Я пытался использовать '$ (OutputPath)' как _VirtualPath_ (к которому он должен иметь доступ на запись, так как именно там он создает .dll), а также '$ (IntermediateOutputPath)' и получил ту же ошибку. (Ну, изменение пути: _ '/ bin /' не является допустимым приложением IIS._ и _ '/ obj/Debug /' не является действительным приложением IIS.) – Adam

+0

Вместо IIS express вы можете попробовать с IIS и посмотрите, работает ли он? Проверьте, поддерживает ли этот параметр в IISExpress https://gist.github.com/paigecook/876258 – Amit

ответ

3

AspNetCompiler вызывает aspnet_compiler.exe (https://msdn.microsoft.com/en-us/library/ms229863.aspx?f=255&MSPPError=-2147217396). В списке ошибок Visual Studio вызовы этого exe отображаются как ASPNETCOMPILER.

Я рекомендую вам включить ведения журнала диагностики уровня https://msdn.microsoft.com/en-us/library/jj651643.aspx, а затем поиск построить журнал для aspnet_compiler.exe строки и проверить, какие параметры (EXPECIALLY, что путь) используются при вызове aspnet_compiler.exe. Также вы можете скопировать из журнала & вручную вызов aspnet_compiler.exe в cmd.exe.

Скорее всего, проблема в атрибуте PhysicalPath, а не в VirtualPath, кажется, что атрибут VirtualPath не влияет на сборку. Проверьте эти ответы:

Если вам нужны отдельные пути для MSBuild и Visual Studio вы можете использовать эту технику http://web4.codeproject.com/Articles/156989/Resolve-temp-global-asax-error-ASPPARSE-Could?display=Print

+0

Спасибо! кажется, что '$ (WebProjectOutputDir)' не определен вообще. Журнал просто дает команду как 'C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_compiler.exe -v /' - наверняка там должен быть -p и путь! – Adam

+1

Изменение '' AspNetCompiler VirtualPath = "/" PhysicalPath = "$ (ProjectDir)" /> 'похоже, работает. В примерах было '$ (ProjectDir) \ .. \ $ (ProjectName)', но я не уверен, почему, так как это просто разрешает ProjectDir ... – Adam

+0

@Adam - 'VirtualPath ="/"' работал для меня. Я рекомендую вам добавить это как ответ, он заслуживает большей видимости (я бы отредактировал его в этом ответе, но ответ слишком общий). – Kobi

1

основе @snautz ответа линии I на самом деле это работает для меня

<AspNetCompiler VirtualPath="/" PhysicalPath="$(ProjectDir)" /> 

Многие из онлайн примеров использовали $(ProjectDir)\..\$(ProjectName) как PhysicalPath, но я не знаю, почему, так как это просто решает $(ProjectDir) ...