Публикация приложения Blazor с помощью API вызывает ошибку: не удалось инициализировать схему - PullRequest
0 голосов
/ 13 июля 2020

Случайная «Ошибка: не удалось инициализировать схему» с приложением Blazor

У меня такая же проблема, когда я публикую sh сайт, возникает эта ошибка. Есть ли другое решение, кроме повторного создания проекта?

Когда я загружаю страницу, я получаю эту ошибку.

Error: The circuit failed to initialize.
e.log 
e.invokeClientMethod
e.processIncomingData
connection.onreceive
i.onmessage
blazor.server.js:1 [2020-07-10T13:59:08.305Z] Information: Connection disconnected.
blazor.server.js:1 Uncaught (in promise) Error: Invocation canceled due to the underlying connection being closed.
    at e.connectionClosed (blazor.server.js:1)
    at e.connection.onclose (blazor.server.js:1)
    at e.stopConnection (blazor.server.js:1)
    at e.transport.onclose (blazor.server.js:1)
    at e.close (blazor.server.js:1)
    at e.stop (blazor.server.js:1)
    at e.<anonymous> (blazor.server.js:1)
    at blazor.server.js:1
    at Object.next (blazor.server.js:1)
    at a (blazor.server.js:1)

С этим Startup.cs

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");

                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();

            app.UseAuthorization();
            app.UseAuthentication();

            app.UsePathBase("/");

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });

        }

ConfigureServices

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor().AddCircuitOptions(o =>
            {
                o.DetailedErrors = true;
            });
            services.AddBlazoredSessionStorage();
            services.AddSingleton<INRPClientApiClient>(x =>
                        new NRPClientApiClient(new Microsoft.Rest.TokenCredentials("default", "token")));

            services.AddOptions();
            services.AddAuthorizationCore();
// this line makes the problem
            services.AddScoped<AuthenticationStateProvider, NrpAuthenticationProvider>(); 

        }

Когда я отключаю свой собственный AuthenticationStateProvider, он работает, но я хочу, чтобы он был в моем приложении.

 public class NrpAuthenticationProvider : AuthenticationStateProvider
    {
        private ISessionStorageService _sessionStorageService;
        public NrpAuthenticationProvider(ISessionStorageService sessionStorageService)
        {
            _sessionStorageService = sessionStorageService;
        }

        public override async Task<AuthenticationState> GetAuthenticationStateAsync()
        {
            var emailAddress = await _sessionStorageService.GetItemAsync<string>("emailAddress");
            var role = await _sessionStorageService.GetItemAsync<string>("role");
            ClaimsIdentity identity;
            if (emailAddress != null)
            {
                identity = new ClaimsIdentity(new[]
            {
                new Claim(ClaimTypes.Name, emailAddress),
                new Claim(ClaimTypes.Role, role),
            }, "apiauth_type");
            }
            else
            {
                identity = new ClaimsIdentity();
            }
            var user = new ClaimsPrincipal(identity);
            return await Task.FromResult(new AuthenticationState(user));
        }

        public void MarkUserAsAuthenticated(string emailAddress, string role)
        {
            var identity = new ClaimsIdentity(new[]
            {
                new Claim(ClaimTypes.Name, emailAddress),
                new Claim(ClaimTypes.Role, role),
            }, "apiauth_type");

            var user = new ClaimsPrincipal(identity);
            NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
        }

        public void MarkUserAsLoggedOut()
        {
            _sessionStorageService.RemoveItemAsync("emailAddress");
            _sessionStorageService.RemoveItemAsync("role");

            var identity = new ClaimsIdentity();

            var user = new ClaimsPrincipal(identity);
            NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));

        }
    }

и _Imports.razor

@using System.Net.Http
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.JSInterop
@using NRPBlazor
@using NRPBlazor.Shared
@using BlazorInputFile
@using System.IO
@using AuthenticationProvider

1 Ответ

0 голосов
/ 15 июля 2020

Наконец-то я заставил его работать, но я не уверен, помогло ли это. Но я изменил тип инициализации сервисов в Startup.cs вот так.

public void ConfigureServices(IServiceCollection services)
{
            services.AddRazorPages();
            
            services.AddServerSideBlazor().AddCircuitOptions(o =>
            {
                o.DetailedErrors = true;
            });
            services.AddSingleton<INRPClientApiClient>(x =>
                        new NRPClientApiClient(new Microsoft.Rest.TokenCredentials("default", "token")));

            services.AddOptions();
            services.AddAuthorizationCore();

            services.AddBlazoredSessionStorage(config => config.JsonSerializerOptions.WriteIndented = true);
            services.AddScoped<AuthenticationStateProvider, NrpAuthenticationProvider>();
            //services.AddBlazoredSessionStorage();

 }
...