Azure DevOps预编译Asp.Net Framework MVC网站报错如何解决
报错根因说明
- 第一个
ASPCONFIG错误:MsBuild预编译时会默认将临时生成的文件存放在项目obj目录下,扫描站点配置时会将obj目录内临时生成的web.config识别为子目录配置,而该文件内包含仅允许在应用根目录定义的MachineToApplication级配置项,因此触发层级错误。 - 第二个
CS0234错误:你修改BaseIntermediateOutputPath后,packages.config模式下的NuGet引用相对路径(默认是基于项目文件的..\packages\xxx路径)无法正确解析,导致大量程序集引用丢失报错。
解决步骤
- 不要修改
BaseIntermediateOutputPath参数,改回默认配置,避免引用路径解析失败。 - 调整MsBuild参数,新增以下配置解决第一个预编译层级错误:
- 新增
/t:Clean,Build参数,每次构建前先清理历史obj、bin目录的遗留文件,避免旧的临时配置残留 - 新增
/p:PrecompileOutputPath=$(build.artifactstagingdirectory)\precompile_temp\参数,将预编译临时文件输出到独立目录,避免和项目内的web.config产生层级冲突 - 检查参数的引号配对,你之前的
/p:PrecompileBeforePublish=true"多了一个结束引号,会导致参数解析异常,修正为/p:PrecompileBeforePublish=true
- 新增
- 调整后的完整MsBuild参数示例:
Invoke-MsBuild -Path "solution.sln" -MsBuildParameters "/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:AutoParameterizationWebConfigConnectionStrings=False /p:PackageLocation=`"\Users\name\code\repofolder\packages\\`" /p:PrecompileBeforePublish=true /t:Clean,Build /p:PrecompileOutputPath=`"\Users\name\code\precompile_temp\\`""
- 如果以上配置仍有报错,检查站点子目录下的
web.config,将<authentication>、<machineKey>、<roleManager>等MachineToApplication级别的配置项统一迁移到站点根目录的web.config中,子目录仅保留目录级授权、处理器映射等配置。 - 兜底方案:放弃MsBuild内置的预编译参数,打包完成后单独调用ASP.NET预编译工具处理站点文件,命令示例:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_compiler.exe -v / -p "你的打包输出站点路径" "预编译结果输出路径" -fixednames
内容的提问来源于stack exchange,提问作者Paul Manzotti
相关产品推荐
相关产品推荐

