构建ASP MVC视图时出现错误

10
我有一个ASP MVC 4项目。它最初是MVC 1,所以使用旧式的ASPX / ASCX视图。我希望视图在构建时编译,主要是为了获取编译时错误检查(并且还重要的是,使错误直接显示在Visual Studio中)。我正在使用IIS Express作为调试服务器,在Visual Studio Pro 2015中进行开发。
根据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 - 我已经将项目配置为在 dev 中作为子目录 /local 运行,所以我尝试了那个,还有来自 .vs 文件夹中配置的站点名称,但都没有成功。
我应该更改 VirtualPath(如果需要更改,更改为什么)还是其他配置缺失,以使 temp 起作用?
编辑
运行命令行 MSBuild 时,我也会收到相同的错误。对于我的实际生产系统,我有一个脚本,使用命令行 MSBuild 进行构建,然后将构建好的包移动到产品服务器并进行部署。因此,在构建时不会有 IIS express (或正在运行的 IIS)。编译视图是否需要连接 Web 服务器?
编辑2
我对这里需要使用虚拟路径以及与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。


@Amit:不起作用。我试过了。 它不是在要求虚拟路径吗?也就是相对于URL的某种方式?我尝试使用$(OutputPath)作为_VirtualPath_(因为它必须具有写入访问权限,因为那里创建了.dll),还尝试使用$(IntermediateOutputPath),但是出现了相同的错误。(好吧,路径改变了:'/bin/'不是有效的IIS应用程序。'和'/obj/Debug/'不是有效的IIS应用程序。') - Adam
你可以尝试使用IIS而不是IIS Express,看看是否有效?请检查此设置是否有助于IISExpress https://gist.github.com/paigecook/876258 - Amit
@Amit:我更愿意使用ISS Express,而不是在我的环境中添加另一层配置。此外,我运行命令行msbuild时会出现相同的错误。对于我实际的生产系统,我有一个脚本,使用命令行msbuild进行构建,然后将构建好的软件包移动到产品服务器并部署。因此,在构建过程中不需要运行IIS Express或IIS。您需要连接Web服务器才能编译视图吗?(我将这个问题添加到问题列表中) - Adam
@Adam,你尝试过使用任何文件夹地址与~结合吗?例如"~/temp"?此外,你是否看过https://dev59.com/3I_ea4cB1Zd3GeqPMlLu? - Armin
“~不起作用。感谢您的帮助,但如果您认为您有答案,可以将其发布为答案:)这样使用评论似乎不太合适。” - Adam
显示剩余9条评论
2个回答

4

AspNetCompiler调用aspnet_compiler.exe(https://msdn.microsoft.com/zh-cn/library/ms229863.aspx?f=255&MSPPError=-2147217396)。在Visual Studio错误列表中,对该exe的调用显示为ASPNETCOMPILER。

我建议您启用诊断级别日志记录https://msdn.microsoft.com/zh-cn/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


谢谢!似乎$(WebProjectOutputDir)根本没有定义。日志只是将命令作为C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /给出 - 肯定应该有一个-p和路径! - Adam
1
更改为<AspNetCompiler VirtualPath="/" PhysicalPath="$(ProjectDir)" />似乎可以解决问题。示例中使用了$(ProjectDir)\..\$(ProjectName),但我不确定为什么,因为这只是将其解析为ProjectDir... - Adam
@Adam - VirtualPath="/" 对我有用。我建议你将其添加为答案,这样它就更加可见了(我本来想将其编辑到这个答案中,但这个答案太笼统了)。 - Kobi

2

根据@snautz的答案,我实际使用的行是

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

许多在线示例使用$(ProjectDir)\..\$(ProjectName)作为PhysicalPath,但我不确定为什么,因为这只是解析为$(ProjectDir)...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接