VS2017发布至Azure App Service时APIFront.xml文件缺失问题求助
我的问题情况
我在Surface和Asus两台设备上开发一个带Swagger的.NET Core 2.0 Web API PoC项目:
- Surface装的是VS2017 15.4.2,一开始发布完全正常;
- 但Asus升级到VS2017 15.5.2后发布就失效了,现在已经更到15.5.3,每次发布到Azure App Service时,APIFront.xml文件都没被包含进去。
我已经试过这些办法,但问题还是没解决:
- 删掉Asus上的解决方案,通过Git重新拉取代码再发布;
- 把APIFront.xml的属性改成**“始终复制”**。
更奇怪的是,后来我用Surface发布到生产槽时也出现了同样的错误,看来不是单纯VS版本的问题。另外我发现一个细节:Asus本地生成的bin文件夹下面是Any CPU和Debug目录,而Surface对应的是Release和Debug目录。
现在Azure App Service启动时直接报错,应用根本跑不起来:
An error occurred while starting the application. FileNotFoundException: Could not find file 'D:\home\site\wwwroot\APIFront.xml'.
整理的可能解决办法
1. 检查发布配置文件的文件规则
打开项目里的发布配置文件(路径一般是Properties/PublishProfiles/<你的发布配置名>.pubxml),看看有没有不小心排除了APIFront.xml,或者有没有明确包含它的配置。如果没有的话,可以手动加这段配置进去,确保文件会被打包:
<ItemGroup> <None Include="APIFront.xml"> <CopyToPublishDirectory>Always</CopyToPublishDirectory> </None> </ItemGroup>
2. 手动检查.csproj里的文件引用
有时候VS界面设置“始终复制”可能没同步到.csproj文件里,你可以直接打开项目的.csproj文件,确认APIFront.xml的配置是不是这样的:
<None Update="APIFront.xml"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None>
如果不是的话,改成上面这样应该能解决文件复制的问题。
3. 清理缓存后重新生成
不管是在Surface还是Asus上,都试试这几步:
- 右键解决方案,选清理解决方案;
- 手动删掉本地的bin和obj文件夹;
- 右键解决方案,选重新生成解决方案;
- 再尝试发布。
这样能清除可能残留的旧构建缓存,避免旧配置干扰新的发布。
4. 确认发布时的构建配置是Release
有时候发布时不小心选了Debug或者Any CPU配置,也会导致文件路径不对:
- 在VS的发布面板里,点击编辑按钮打开发布配置;
- 切换到设置标签页,确认配置下拉框选的是
Release; - 同时检查目标运行时是不是符合你的需求,避免因为运行时差异导致文件找不到。
5. 用Kudu检查Azure上的文件
你可以通过Azure门户的Kudu工具看看生产槽的wwwroot目录里到底有没有APIFront.xml:
- 进入Azure App Service的概览页面,点击高级工具 -> Go;
- 在Kudu界面里,点Debug console -> CMD;
- 导航到
site\wwwroot目录,看看文件列表里有没有APIFront.xml。
如果确实没有,说明问题出在本地打包的时候,不是Azure部署的问题。
6. 检查Swagger对XML文件的引用
如果APIFront.xml是Swagger生成的文档文件,你得确认代码里的Swagger配置是不是指定对了文件名。比如类似这样的代码:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" }); var xmlFile = $"APIFront.xml"; // 确保这里的文件名和实际一致 var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); });
要是代码里写的文件名和实际的APIFront.xml不匹配,也会导致找不到文件的错误。
内容的提问来源于stack exchange,提问作者Magnus Karlsson

