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

时间:2019-10-23 13:09:04

标签: blazor

由于appsettings.json在blazor WA上无法很好地工作,因此我创建了自己的文件并将.json文件放在wwwroot中,在需要该文件的页面中,我使用{ {1}}进入文件如下 HttpClient

这很好用,但是我要在多个页面中执行此操作,因此我想在startup.cs中注入config = await Http.GetJsonAsync<Configuration>("/config/appsettings.json");对象/服务,并让我的页面使用它而不是多次执行。

我很难在Startup.cs中找到如何正确读取文件的方法,我们将不胜感激。

更新

似乎ConfigurationApp.OnInitializedAsync之前被解雇,但{​​{1}}花费的时间更长,这导致Index.OnInitializedAsync在上述行之前执行。

这是所有代码

Startup.cs

Settings = await httpClient.GetJsonAsync<Settings>("/config/appsettings.json").ConfigureAwait(false);

App.razor

App.OnInitializedAsync

Index.razor

    public class Startup
    {

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

    }

这是序列

    protected override async Task OnInitializedAsync()
    {

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

    }

1 个答案:

答案 0 :(得分:1)

恕我直言,最好的方法是注册一个单身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);
                });
        }

然后在需要设置的地方异步调用。在样本页面中

@inject Task<Settings> _getSettings

...

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

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