Blazor 服务器 SignarlR HubConnection StartAsync 引发错误

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

当集线器碰到

StartAsync()
线时,它会抛出此错误:

JsonReaderException: '<' is an invalid start of a value. 

我的猜测是

HubConnection
正在获取 HTML 而不是 JSON。但是html是什么?我怎样才能看到导致
HubConnection
StartAsync()
上失败的内容是什么?

这是正在运行的完整代码。我可以看到访问令牌,所以我知道它不为空,并且我知道它是有效的,因为我可以访问其他

[Authorized]
页面。

protected override async Task OnInitializedAsync()
{
    //create the hub with the url and a token
    //configure logging to get better errors
    hubConnection = new HubConnectionBuilder()
    .WithUrl(
        NavigationManager.ToAbsoluteUri("/chathub"), options =>
        {
            options.AccessTokenProvider = () => Task.FromResult(TokenProvider.AccessToken);
        })
    .ConfigureLogging(logging => {
        logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
    )
    .Build();


    //create a listener for any incoming messages
    hubConnection.On<ChatMessage>("ReceiveMessage", (message) =>
    {
        ChatMessages.Add(message);
        StateHasChanged();
    });

    //start the hub and away we go
    await hubConnection.StartAsync();
}

这里是枢纽

namespace territory_lords.Hubs
{
    [Authorize]
    public class ChatHub : Hub
    {
        public async Task SendMessage(ChatMessage chatMessage)
        {
            //just send it to the people who aren't us. We already know about it
            await Clients.Others.SendAsync("ReceiveMessage", chatMessage);
        }
    }
}

这是从启动进行配置

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseResponseCompression();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

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

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


        app.UseEndpoints(endpoints =>
        {

            endpoints.MapControllers();
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
            endpoints.MapHub<ChatHub>("/chathub");
        });
    }
c# signalr blazor blazor-server-side .net-5
1个回答
0
投票

这是一个措辞非常糟糕的身份验证错误。我希望 SignalR 知道它在做什么,这样它就可以告诉您发送了哪些身份验证以及为什么响应是意外的。

您的

AddAuthentication
是空白的,我不确定您想使用哪种方法。我将展示一个利用协商的示例,该示例将允许使用本地用户帐户进行本地 AD 身份验证。这有利于本地开发。如果你正在做云,那么你需要传递 AzureAD 令牌,这是一个完全不同的蠕虫罐头。

我为 SignalR 打开了一些更详细的日志记录,它正在谈论协商。

Microsoft.AspNetCore.Http.Connections.Client.HttpConnection|无法启动连接。从

获取协商响应时出错

所以我在我的 hub 项目中安装了一个 NuGet 包:

Microsoft.AspNetCore.Authentication.Negotiate

然后我添加了一个服务配置以允许在我的集线器启动中进行协商:

builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();

现在,当客户端要求协商时,他们可以神奇地传递本地用户并使用您的本地域进行身份验证。

© www.soinside.com 2019 - 2024. All rights reserved.