2017-02-23 126 views
8

我有一個ASP MVC 4項目。它以MVC 1開頭,因此它使用舊式的ASPX/ASCX視圖。我想在編譯時編譯視圖,主要是爲了獲得編譯時錯誤檢查(並且重要的是讓錯誤直接在Visual Studio中顯示)。我正在使用IIS Express作爲調試服務器在Visual Studio Pro 2015中進行開發。在構建時嘗試構建ASP MVC視圖時出錯

按照雙方msdnHaacked以及諸如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

我已經嘗試過各種替代品VirtualPath文件 - 我已在項目配置爲作爲子目錄中開發/本地運行,所以我嘗試過,並從.vs文件夾中的配置站點名稱,沒有任何工作。

我應該改變VirtualPath(如果有的話是什麼),或者是有一些其他配置失蹤溫度工作?

編輯

而且,我得到運行一個命令行的MSBuild同樣的錯誤。對於我的實際生產系統,我有一個使用命令行MSBuild進行構建的腳本,然後將構建的包移動到產品服務器並部署。因此,它在構建時不會有任何IIS表示(或IIS運行)。你需要連接一個網絡服務器來編譯視圖嗎?

編輯2

我感到有必要在這裏virtulPath和Web服務器的連接顯然混淆。一些建議的解決方案涉及配置IIS。根據我的理解,IIS Express(我用於調試)甚至不必運行到之後成功構建?反正,我的應用程序的虛擬目錄中運行相當愉快(在調試模式/本地),但使用的是作爲一種價值不起作用。如果它的事項,這是在我的項目在.VS文件夾中對ApplicationHost.config的相關部分(我試圖把相同的路徑進入applciationhost.config在文件/ IIS快遞):

<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

與到dotnet的過程寫訪問您的解決方案創建Temp目錄。在構建項目時,它創建temporaty文件,並根據錯誤無法找到臨時目錄/虛擬路徑。一旦發現它檢查寫訪問是否存在。希望這可以幫助! – Amit

+0

@Amit:不起作用。試過了。 它不是要求一個虛擬路徑。即不知何故相對於網址?我嘗試使用'$(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字符串的生成日誌,並檢查調用aspnet_compiler.exe時使用的參數(尤其是什麼路徑)。也可以從日誌&複製手動調用cmd.exe中的aspnet_compiler.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

更改爲''似乎工作。這個例子有'$(ProjectDir)\ .. \ $(ProjectName)',但我不知道爲什麼,因爲這只是解決ProjectDir ... – Adam

+0

@Adam - 'VirtualPath =「/」'爲我工作。我建議你加入這個答案作爲答案,它應該更加明顯(我會將它編輯成這個答案,但答案太籠統了)。 – Kobi

1

基於@snautz回答,我行實際上對我來說使用的是

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

許多網上的例子使用$(ProjectDir)\..\$(ProjectName)作爲PhysicalPath但我不知道爲什麼,因爲這只是解析$(ProjectDir) ...