Blazor на стороне клиента (WebAssembly) читает файл json в файле startup.cs - PullRequest
1 голос
/ 23 октября 2019

Поскольку appsettings.json не очень хорошо работает с Blazor WA, я создаю свой собственный файл .json и помещаю его в wwwroot, на страницах, где он требуется, я использую 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 выполняется ДО указанной выше строки.

здесь весь код

Startup.cs

    public class Startup
    {

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

    }

App.razor

    protected override async Task OnInitializedAsync()
    {

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

    }

Index.razor


    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);

            }
        }
    }

Вот последовательность

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 

1 Ответ

1 голос
/ 24 октября 2019

Лучший способ IMHO - зарегистрировать синглтон 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 выполняется только один раз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...