我们正在将我们的一个应用程序(在本例中为IdentityServer)从.NET 5更新到.NET 6。它由IIS托管,由Azure Devops Services部署。我们看到的问题是,在我们的开发环境中,网站无法加载,但在我们的过渡环境中,网站运行正常。我们在开发中看到的错误是
12:45:37.519|Fatal|1||Host terminated unexpectedly.||
System.IO.DirectoryNotFoundException: D:\agent\_work\38\s\IdentityServer\wwwroot\
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters)
at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.<>c.<UseStaticWebAssetsCore>b__1_0(String contentRoot)
at Microsoft.AspNetCore.StaticWebAssets.ManifestStaticWebAssetFileProvider..ctor(StaticWebAssetManifest manifest, Func`2 fileProviderFactory)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.UseStaticWebAssetsCore(IWebHostEnvironment environment, Stream manifest)
at Microsoft.AspNetCore.Hosting.StaticWebAssets.StaticWebAssetsLoader.UseStaticWebAssets(IWebHostEnvironment environment, IConfiguration configuration)
at Microsoft.AspNetCore.WebHost.<>c.<ConfigureWebDefaults>b__9_0(WebHostBuilderContext ctx, IConfigurationBuilder cb)
at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass9_0.<ConfigureAppConfiguration>b__0(HostBuilderContext context, IConfigurationBuilder builder)
at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at IdentityServer.Program.Main(String[] args) in D:\agent\_work\38\s\IdentityServer\Program.cs:line 23
它报告的路径D:\agent\_work\38\s\IdentityServer\wwwroot\
很有趣,因为该路径与DevOps构建计算机的路径相同。如果我们恢复到.NET 5,我们不会看到此错误,并且在过渡计算机上也不会看到此问题。Program.cs
类定义为
using System;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using NewRelic.LogEnrichers.Serilog;
using Serilog;
using Serilog.Events;
namespace IdentityServer
{
public class Program
{
public static int Main(string[] args)
{
try
{
CreateLogger();
Log.Information("Starting host...");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly.");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static void CreateLogger()
{
var configuration = GetConfiguration();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext() // allows logging middleware to inject output values
.Enrich.WithThreadId()
.Enrich.WithNewRelicLogsInContext()
.CreateLogger();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var configuration = GetConfiguration();
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder =>
{
webBuilder.UseConfiguration(configuration);
webBuilder.UseSerilog();
webBuilder.UseIIS();
webBuilder.CaptureStartupErrors(true);
webBuilder.UseStartup<Startup>();
});
}
private static IConfiguration GetConfiguration()
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{environment}.json", true, true);
var configuration = builder.Build();
return configuration;
}
}
}
我们确实有其他.NET 6 Web应用程序在此IIS示例上运行良好。我认为问题可能出在我们的发布管道中,但它们在不同环境中的任务配置是相同的。尝试在代码或配置中查找目录路径,但在任何地方都找不到。已尝试通过 Program.cs 中的.UseWebRoot("path to folder")
和.UseContentRoot("path to folder")
手动设置WebRoot和ContentRoot路径,但未看到日志或应用程序启动中的任何变化。
甚至更新了 web.config 文件,使其具有执行aspNetCore
元素中项目dll的确切路径,但仍然没有任何更改。
更新日期:2022年2月10日
在启动时添加调试输出以验证文件和文件夹路径。环境变量和执行文件路径中的所有内容看起来都正确。
ASPNETCORE_IIS_PHYSICAL_PATH - C:\inetpub\webapps\IdentityServer\
Executable Path: C:\inetpub\webapps\IdentityServer\IdentityServer.dll
1条答案
按热度按时间3pmvbmvn1#
最后的问题是我们如何将更新从DevOps推送到服务器。我们的管道被构建为从build文件夹的Release目录复制文件。这种方法的问题之一是,站点运行不需要但在构建过程中生成的文件也会被复制到发布服务器。在这种情况下,在.NET 6中生成的新文件
.staticwebassets.runtime.json
正在被复制到我们的服务器上。NET 6的行为方式似乎是,如果环境设置为
Development
,那么它将查找此文件,以确定静态Web资源的位置。如果文件不存在,那么它将假定文件位于站点的wwwroot子目录中。这对于从本地Visual Studio运行项目的情况是有意义的。关于这个文件的更多细节可以在另一个SO post中找到,这个SO post链接到GitHub中的源代码。为了解决这个问题,我们修改了我们的发布管道,使用在解决方案上运行publish
命令时生成的publish.zip
文件。这个存档只包含运行网站所需的文件,所以没有像.staticwebassets.runtime.json
这样的无关文件被包括在内。我们应该一直这样做...吸取了教训。现在我们解压缩
publish.zip
文件,应用任何文件转换,然后将解压缩的文件复制到Web服务器。