我一直在尝试使用 nginx 应用服务器在 ubuntu 服务器上托管 dotnet core。当我的所有代码在 DEV 机器(Windows 11)上运行后,我将代码发布到服务器。 Swagger 可以工作,但实际的 API 调用却不能,它会抛出内部服务器错误。登录后,我发现下面的行没有在我的startup/Program.cs代码中正确绑定配置。然而,它在我的 DEV 机器以及使用 VirtualBox 的 Windows 服务器上完美运行。
var authorizationOptions = new AuthorizationOptions();
config.GetSection(AuthorizationOptions.ConfigKey).Bind(authorizationOptions);
//authorizationOptions has no values post .Bind
授权选项.cs
public class AuthorizationOptions
{
public const string ConfigKey = "Authorization";
public string? ActiveProvider { get; set; }
public List<AuthorizationProviderOptions>? Providers { get; set; }
}
AuthorizationProviderOptions.cs
public class AuthorizationProviderOptions
{
public string Name { get; set; } = string.Empty;
public string Domain { get; set; } = string.Empty;
public string Audience { get; set; } = string.Empty;
public string SecretKey { get; set; } = string.Empty;
public string Issuer { get; set; } = string.Empty;
public string TokenLifetime { get; set; } = string.Empty;
}
应用程序设置.json
{
"Authorization": {
"ActiveProvider": "JWT",
"Providers": [
{
"Name": "Auth0",
"Domain": "XXXXXXXXXXXXXXXXXXXXX",
"SecretKey": "",
"Issuer": "",
"Audience": "XXXXXXXXXXXXXXXXXXXXX",
"TokenLifetime": "20"
},
{
"Name": "JWT",
"Domain": "",
"SecretKey": "XXXXXXXXXXXXXXXXXXXXX",
"Issuer": "XXXXXXXXXXXXXXXXXXXXX",
"Audience": "XXXXXXXXXXXXXXXXXXXXX",
"TokenLifetime": "20"
}
]
}
}
其他详情:
.NET Version
:8
Server
:Ubuntu 20.04
这几天我都在摸不着头脑。任何帮助将不胜感激,谢谢。
更新:从我调用配置代码的地方:
Program.cs(API项目)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCAAuthentication(builder.Configuration);
AuthorizationInjectorServiceExtension.cs(此文件位于 API 项目引用的不同类库项目中)
public static class AuthorizationInjectorServiceExtension
{
public static IServiceCollection AddCAAuthentication(this IServiceCollection services, IConfigurationManager config)
{
var authorizationOptions = new AuthorizationOptions();
config.GetSection(AuthorizationOptions.ConfigKey).Bind(authorizationOptions);
//do other things based on the values of authorizationOptions
}
}
更新 2: 在 @FolabiAhn 发表评论后,我将
appsettings.json
文件夹向上移动了一个文件夹,现在它可以工作了!但是,我仍然不确定为什么会这样。
以前的目录结构:
/var/www/[mysitename]/html/[site files with appsettings.json]
有效的新目录结构:
/var/www/[mysitename]/html/[site files]
/var/www/[mysitename]/appsettings.json
我使用
html
子文件夹结构只是为了遵循 nginx/ubuntu 的风格。我随时可以改变它。
此行为源自
WebApplication.CreateBuilder(args)
的使用。它会自动将 ContentRootPath
分配给 Directory.GetCurrentDirectory()
。
因此,当尝试查找 appsettings.json 时,将引用当前工作目录,而不一定是应用程序的目录。 我敢打赌您是从指定目录之外执行应用程序,导致无法找到 .json 文件。
要解决这个问题,您有几种选择。首先,您可以使用
cd
导航到应用程序的路径目录,然后从那里执行应用程序。
其次,如果您打算将应用程序作为服务运行,您可以配置工作目录以匹配应用程序本身的工作目录。
[Unit]
Description=My Application ...
[Service]
WorkingDirectory=/var/www/[mysitename]/html
ExecStart=/usr/bin/dotnet /var/www/[mysitename]/html/Application.dll
...