当集线器碰到
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");
});
}
这是一个措辞非常糟糕的身份验证错误。我希望 SignalR 知道它在做什么,这样它就可以告诉您发送了哪些身份验证以及为什么响应是意外的。
您的
AddAuthentication
是空白的,我不确定您想使用哪种方法。我将展示一个利用协商的示例,该示例将允许使用本地用户帐户进行本地 AD 身份验证。这有利于本地开发。如果你正在做云,那么你需要传递 AzureAD 令牌,这是一个完全不同的蠕虫罐头。
我为 SignalR 打开了一些更详细的日志记录,它正在谈论协商。
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection|无法启动连接。从
获取协商响应时出错
所以我在我的 hub 项目中安装了一个 NuGet 包:
Microsoft.AspNetCore.Authentication.Negotiate
然后我添加了一个服务配置以允许在我的集线器启动中进行协商:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();
现在,当客户端要求协商时,他们可以神奇地传递本地用户并使用您的本地域进行身份验证。