Blazor 客户端 (WebAssembly) 在startup.cs 上读取 json 文件

Zoi*_*nky 5 blazor

由于appsettings.json与 blazor WA 配合得不好,我正在创建自己的文件并将文件放入.jsonwwwroot在需要它的页面中,我使用HttpClient来获取文件,如下所示 config = await Http.GetJsonAsync<Configuration>("/config/appsettings.json");

这很好用,但是我在多个页面中执行此操作,因此我想Configuration在startup.cs 中注入对象/服务,并让我的页面使用它而不是多次执行此操作。

我很难找到如何正确读取 Startup.cs 中的文件,任何帮助将不胜感激。

更新

似乎App.OnInitializedAsync之前已被触发Index.OnInitializedAsync,但Settings = await httpClient.GetJsonAsync<Settings>("/config/appsettings.json").ConfigureAwait(false);需要更长的时间导致App.OnInitializedAsync在上面的行之前执行。

这是所有代码

启动.cs

    public class Startup
    {

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<ConfigurationManager>();
            services.AddBlazoredToast();
        }
        public void Configure(IComponentsApplicationBuilder app)
        {
            app.AddComponent<App>("app");
        }

    }
Run Code Online (Sandbox Code Playgroud)

应用剃刀

    protected override async Task OnInitializedAsync()
    {

        Console.WriteLine("App.OnInitializedAsync");
        await configManager.InitializeAsync();

    }
Run Code Online (Sandbox Code Playgroud)

索引剃刀


    protected override async Task OnInitializedAsync()
    {
        Console.WriteLine("Index.OnInitializedAsync");


        //config = await Http.GetJsonAsync<Configuration>("/config/appsettings.json");
        if (configManager == null)
        {
            Console.WriteLine("Index.OnInitializedAsync config manager is null");
        }
        else
        {
            if (configManager.Settings == null)
            {
                Console.WriteLine("Index.OnInitializedAsync config.Settings is null");
            }
            else
            {
                Console.WriteLine("base url" + configManager.Settings.ApiBaseUrl);

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是顺序

WASM: App.OnInitializedAsync
WASM: ConfigurationManager.InitializeAsync
WASM: Index.OnInitializedAsync
WASM: Index.OnInitializedAsync config.Settings is null
WASM: ConfigurationManager.Setting has been set: ApiBaseUrl https://localhost:44316 
Run Code Online (Sandbox Code Playgroud)

agu*_*ars 6

恕我直言,最好的方法是注册一个单例Task

        public void ConfigureServices(IServiceCollection services)
        {
            services
                .AddSingleton(async p =>
                {
                    var httpClient = p.GetRequiredService<HttpClient>();
                    Console.WriteLine("Get settings called");
                    return await httpClient.GetJsonAsync<Settings>("settings.json")
                        .ConfigureAwait(false);
                });
        }

Run Code Online (Sandbox Code Playgroud)

并在需要设置的地方使用异步调用。在示例页面中

@inject Task<Settings> _getSettings

...

@code {
    protected override async Task OnInitializedAsync()
    {
        var settings = await _getSettings;
        Console.WriteLine("Settings received in main {0}", settings?.ApiBaseUrl);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,对settings.json的调用只需一次