我有一个ASP MVC 4项目。它起始于MVC 1,因此它使用旧式ASPX / ASCX视图。我希望在构建时编译视图,主要是为了获得编译时错误检查(而且,重要的是,要在Visual Studio中直接显示错误)。我正在使用IIS Express作为调试服务器在Visual Studio Pro 2015中进行开发。
根据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
我已经尝试了各种替代方案 VirtualPath - 我将项目配置为在dev中作为子目录 / local 运行所以我试过了,并且该站点来自.vs文件夹中配置的名称,没有任何作用。
我应该更改 VirtualPath (如果是这样的话)或者 temp 还缺少其他配置吗?
修改
此外,运行命令行MSBuild时出现同样的错误。对于我的实际生产系统,我有一个脚本,它使用命令行MSBuild进行构建,然后将构建的包移动到产品服务器并进行部署。因此,在构建时不会有IIS express(或IIS运行)。您是否需要连接Web服务器才能编译视图?
修改2
我对这里对virtulPath的需求以及与Web服务器的明显连接感到困惑。一些建议的解决方案涉及配置IIS。 IIS Express(我用于调试)甚至不一定在成功构建之后运行,因为我理解它?无论如何,我的应用程序非常愉快地运行在虚拟目录中( / local 在调试模式下)但是使用它作为值不起作用。如果重要,这是我项目中.vs文件夹中applicationhost.config的相关部分(我尝试将相同的路径放入Documents / IIS Express中的applciationhost.config):
<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 :(得分: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时正在使用的参数(特别是路径)。你也可以从log&amp; amp;在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
答案 1 :(得分:2)
基于@snautz答案,我实际使用的对我有用的行是
<AspNetCompiler VirtualPath="/" PhysicalPath="$(ProjectDir)" />
许多在线示例使用$(ProjectDir)\..\$(ProjectName)
作为PhysicalPath
,但我不确定原因,因为这只是解析为$(ProjectDir)
...