.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
相关产品推荐
相关产品推荐

