返回

解决Linux部署.Net Core Web API出现的ERR_CONNECTION_RESET错误

Linux

在Linux系统上部署.Net Core Web API,你可能会碰到浏览器突然中断连接,并抛出"ERR_CONNECTION_RESET"错误,API访问也就中断了。这个问题很棘手,因为它出现的时机捉摸不定,重启应用后可能暂时恢复正常,但过一段时间又会再次出现。

经过调查,我发现这个问题通常与WebHost.CreateDefaultBuilder(args)方法的使用有关。当你用这个方法创建WebHost时,它会自动进行一些配置,其中一些设置可能与Linux系统不兼容,最终导致连接重置错误。

那么,我们该如何解决这个问题呢?

我们可以考虑放弃使用WebHost.CreateDefaultBuilder(args),转而使用new WebHostBuilder()手动构建WebHost。这样做能让你更精细地控制WebHost的配置,避免使用默认配置中可能存在的隐患。

具体操作步骤:

  1. 打开你的Program.cs文件。
  2. 找到使用WebHost.CreateDefaultBuilder(args)创建WebHost的代码,例如:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();
  1. 将这段代码替换成以下代码:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
        })
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;
            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
            config.AddEnvironmentVariables();
        });

这段代码手动配置了Kestrel服务器、内容根目录、IIS集成、日志记录和应用程序配置。其中,ConfigureAppConfiguration方法用于加载appsettings.json文件中的配置信息,解决了使用new WebHostBuilder()后无法读取配置文件的问题。

  1. 保存文件并重新编译你的应用程序。

完成以上步骤后,你的应用程序应该能在Linux系统上稳定运行,不会再出现"ERR_CONNECTION_RESET"错误。

需要注意的是, 手动配置WebHost需要你对.Net Core应用程序的运行机制有一定的了解。如果你对这些配置项不熟悉,可以参考.Net Core官方文档或其他相关资料。

这种方法虽然能解决问题,但同时也增加了配置的复杂度。如果你希望用更简单的方法解决问题,可以尝试升级.Net Core版本,或者检查Linux系统是否存在其他配置问题,比如防火墙设置、网络连接稳定性等。

"ERR_CONNECTION_RESET"错误的出现可能由多种因素导致。通过仔细分析错误信息和应用程序的配置,你应该能找到解决问题的方法,让你的.Net Core Web API在Linux系统上稳定运行。

常见问题及其解答:

1. 为什么使用WebHost.CreateDefaultBuilder(args)会导致"ERR_CONNECTION_RESET"错误?

WebHost.CreateDefaultBuilder(args)会自动应用一些默认配置,这些配置在某些Linux环境下可能不适用,例如它可能会使用与Linux内核不兼容的网络设置,从而导致连接重置。

2. 手动配置WebHost有哪些需要注意的地方?

手动配置WebHost需要你对.Net Core应用程序的运行机制有一定的了解。你需要确保配置的各个组件(如Kestrel、日志记录、应用程序配置等)都能正常工作,并且相互之间没有冲突。

3. 除了手动配置WebHost,还有其他解决"ERR_CONNECTION_RESET"错误的方法吗?

可以尝试升级.Net Core版本,或者检查Linux系统是否存在其他配置问题,例如防火墙设置、网络连接稳定性等。一些情况下,这个问题也可能是由应用程序代码中的Bug导致的,需要进行代码调试来排查问题。

4. ConfigureAppConfiguration方法的作用是什么?

ConfigureAppConfiguration方法用于配置应用程序的配置源。在手动配置WebHost时,我们需要使用这个方法来加载appsettings.json文件中的配置信息,否则应用程序将无法读取配置文件。

5. 如果我仍然无法解决问题,该怎么办?

你可以尝试搜索网络,查看是否有其他人遇到过类似的问题,并找到了解决方案。你也可以在.Net Core社区或论坛上寻求帮助,或者联系微软的技术支持团队。