You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core v2配置Kestrel及Ubuntu 16.04项目连接远程数据库问题

问题1:如何在.NET Core v2中使用hosting.json和appsettings.json配置Kestrel?

使用hosting.json配置Kestrel

  • 第一步,在项目根目录创建hosting.json文件,记得右键文件→属性,把“复制到输出目录”设置为如果较新则复制,这样发布时文件会同步到服务器。
  • 给个常见的配置示例,包含HTTP/HTTPS端点和证书设置:
{
  "server.urls": "http://0.0.0.0:5000;https://0.0.0.0:5001",
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http1AndHttp2"
    },
    "Https": {
      "Certificate": {
        "Path": "./my-cert.pfx",
        "Password": "your-secure-password"
      }
    }
  }
}
  • 然后需要在Program.cs中手动加载这个配置文件,因为CreateDefaultBuilder默认不会识别hosting.json:
public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseConfiguration(new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("hosting.json", optional: true, reloadOnChange: true)
            .Build())
        .UseStartup<Startup>()
        .Build();

使用appsettings.json配置Kestrel

这个更省心,因为CreateDefaultBuilder默认会加载appsettings.json和appsettings.{Environment}.json,直接在文件里添加Kestrel节点即可:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "Kestrel": {
    "Limits": {
      "MaxRequestBodySize": 104857600, // 限制最大请求体为100MB
      "KeepAliveTimeout": "00:02:00"
    },
    "Endpoints": {
      "Http": {
        "Url": "http://0.0.0.0:5000"
      },
      "Https": {
        "Url": "https://0.0.0.0:5001",
        "Certificate": {
          "Path": "/etc/ssl/certs/my-cert.pfx",
          "Password": "cert-password"
        }
      }
    }
  }
}

注意:如果同时使用两种配置文件,优先级为命令行参数 > hosting.json > appsettings.{Environment}.json > appsettings.json,冲突项会被高优先级配置覆盖。


问题2:Ubuntu 16.04上部署的.NET Core MVC项目无法连接远程数据库的排查与解决

我之前部署.NET Core项目到Linux服务器时也碰到过类似的数据库连接问题,一步步排查下来基本都能找到根源,你可以按下面的流程来:

1. 先排查网络连通性

这是最常见的问题,先确认两台服务器之间能正常通信:

  • 在Ubuntu服务器上执行ping <数据库服务器IP>,看是否能收到响应。如果ping不通,说明两台服务器不在同一网段,或者数据库服务器的防火墙/安全组拦截了ICMP请求。
  • 再测试数据库端口(比如SQL Server默认1433,MySQL默认3306):用telnet <数据库IP> <端口>或者nc -zv <数据库IP> <端口>。如果显示“连接被拒绝”,那肯定是数据库服务器的防火墙/安全组没有开放对应端口给Ubuntu服务器的IP,需要去数据库服务器那边调整规则。

2. 核对连接字符串

打开部署目录下的appsettings.json,仔细检查连接字符串的每一项:

  • SQL Server的正确格式示例:
"ConnectionStrings": {
  "DefaultConnection": "Server=<数据库IP>,<端口>;Database=<数据库名>;User Id=<数据库用户名>;Password=<密码>;TrustServerCertificate=True;"
}
  • MySQL的正确格式示例:
"ConnectionStrings": {
  "DefaultConnection": "server=<数据库IP>;port=<端口>;database=<数据库名>;user=<用户名>;password=<密码>;SslMode=Required;"
}

提示:可以在本地用相同的连接字符串测试连接,排除凭据或数据库本身的问题。

3. 确认数据库用户的连接权限

很多时候是用户权限的问题:

  • 比如MySQL中,默认创建的用户可能是user@localhost,只能本地连接,需要改成user@%(允许所有IP)或者user@<Ubuntu服务器IP>;
  • SQL Server中,要确保启用了SQL Server身份验证(如果用的不是Windows认证),并且用户有对应数据库的访问权限,同时登录账号允许从远程IP连接。

4. 检查数据库驱动兼容性

.NET Core 2.x版本较老,要确保用的数据库驱动版本兼容:

  • 比如SQL Server用Microsoft.EntityFrameworkCore.SqlServer的2.x版本,MySQL用MySql.EntityFrameworkCore的2.x版本,不要用太新的包(比如6.x+),否则会出现兼容性问题。
  • 发布项目时,确认驱动包已经被正确复制到服务器的发布目录,可以查看*.deps.json文件确认依赖是否存在。

5. 查看项目运行日志定位错误

如果上面的步骤都没问题,就看日志找具体错误:

  • 如果是用systemd托管的服务,执行journalctl -u <你的服务名称>查看运行日志;
  • 或者看项目目录下的日志文件(默认在logs文件夹),里面会有详细的异常信息,比如“登录失败”“无法解析服务器地址”等,根据错误信息针对性解决。

6. 用本地客户端测试(可选)

在Ubuntu服务器上安装数据库客户端(比如SQL Server的mssql-tools,MySQL的mysql-client),用相同的凭据连接数据库。如果客户端能连,说明问题出在项目配置或代码上;如果客户端也连不上,那还是网络或权限的问题。


内容的提问来源于stack exchange,提问作者M. Douglas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:15:17