当集线器碰到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|无法启动连接。从<!获取协商响应时出错;!集线器名称>
所以我在集线器项目中安装了一个NuGet包:Microsoft.AspNetCore.Authentication.Negotiate
然后我添加了一个服务配置,以允许在我的集线器启动中进行协商:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();
现在,当客户端请求协商时,他们可以神奇地传递本地用户并使用您的本地域进行身份验证。
相关阅读:https://learn.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-6.0&tabs=visual studio