Dotnet core 配置绑定在 ubuntu nginx 上不起作用

问题描述 投票:0回答:1

我一直在尝试使用 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 的风格。我随时可以改变它。

nginx .net-core ubuntu-20.04
1个回答
0
投票

此行为源自

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
...
© www.soinside.com 2019 - 2024. All rights reserved.