1

我有一个 .NET Core 2.2 MVC 应用程序,它使用 Azure SignalR 服务实时推送来自多个 Azure Functions 的更新数据。跟踪日志显示客户端上的所有内容都按预期工作。但是,成功建立连接后,后端集线器上的 OnConnectedAsync 方法只会触发大约 10% 的时间。也就是说,10% 的时间 OnConnectedAsync 触发并且一切都按预期工作。

我曾尝试删除加载客户端的其他 JS 文件,以查看它们中是否有任何干扰 SignalR 功能,但到目前为止我什么也找不到。

我简化的后端集线器代码是:

[Authorize]
public class NotificationHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
    }

    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await base.OnDisconnectedAsync(exception);
    }
}

Startup 类中的 ConfigureServices 方法包括:

services.AddMvc();
services.AddSignalR(options =>
{
    options.EnableDetailedErrors = true;
}).AddAzureSignalR();

Startup 类中的 Configure 方法包括:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});
app.UseAzureSignalR(routes =>
{
    routes.MapHub<NotificationHub>("/notificationhub");
});

该应用程序使用 Microsoft.AspNetCore.SignalR 1.1.0、Microsoft.Azure.SignalR 1.0.10 和 aspnet/signalr@1.1.4。

使用 Azure SignalR 绑定(通过上述相同的库以及 Microsoft.Azure.WebJobs.Extensions.SignalRService 1.0.0)通过几个不同的 Azure Functions 推送数据更新:

[SignalR(HubName = "notificationhub")] IAsyncCollector<SignalRMessage> signalRMessages

当客户端应用程序首次启动时,我看到相同的客户端调试消息集,类似于:

[2019-07-06T20:49:01.625Z] Information: Normalizing '/notificationhub' to 'https://localhost:5001/notificationhub'. Utils.ts:184:30
[2019-07-06T20:49:01.626Z] Debug: Starting HubConnection. Utils.ts:187:16
[2019-07-06T20:49:01.626Z] Debug: Starting connection with transfer format 'Text'. Utils.ts:187:16
[2019-07-06T20:49:01.627Z] Debug: Sending negotiation request: https://localhost:5001/notificationhub/negotiate. Utils.ts:187:16
[2019-07-06T20:49:01.700Z] Debug: Sending negotiation request: https://insys.service.signalr.net/client/negotiate?hub=notificationhub&asrs.op=%2Fnotificationhub. Utils.ts:187:16
[2019-07-06T20:49:01.968Z] Debug: Selecting transport 'WebSockets'. Utils.ts:187:16
[2019-07-06T20:49:01.969Z] Trace: (WebSockets transport) Connecting. Utils.ts:187:16
[2019-07-06T20:49:02.127Z] Information: WebSocket connected to wss://insys.service.signalr.net/client/?hub=notificationhub&asrs.op=%2Fnotificationhub&id=gtEYI2u4eUbcEx2iKvSHQg&access_token=... Utils.ts:184:30
[2019-07-06T20:49:02.128Z] Debug: Sending handshake request. Utils.ts:187:16
[2019-07-06T20:49:02.128Z] Trace: (WebSockets transport) sending data. String data of length 32. Content: '{"protocol":"json","version":1}?'. Utils.ts:187:16
[2019-07-06T20:49:02.128Z] Information: Using HubProtocol 'json'. Utils.ts:184:30
[2019-07-06T20:49:02.344Z] Trace: (WebSockets transport) data received. String data of length 3. Content: '{}?'. Utils.ts:187:16
[2019-07-06T20:49:02.344Z] Debug: Server handshake complete.

当 OnConnectedAsync 触发和不触发时,会生成一组类似的服务器端跟踪:

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST https://localhost:5001/notificationhub/negotiate text/plain;charset=UTF-8 0
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization was successful.

我可以在跟踪中看到的唯一区别是:

Microsoft.AspNetCore.SignalR.HubConnectionContext:Information: Completed connection handshake. Using HubProtocol 'json'.

成功触发 OnConnectedAsync 时包含在内。

我浏览了所有 Azure SignalR 文档,发现我的代码没有任何问题。

即使与 Azure SignalR 服务的连接成功,什么机制也可能只允许客户端/服务器连接不能在 100% 的时间内完成?

4

1 回答 1

2

这并不是一个真正明确的答案,因为我仍然不确定根本原因,但是通过创建新的 Azure SignalR 服务并切换到该服务来解决问题。

在我的研究中,我确实在某处读到,尝试使用多个集线器连接到服务可能会导致问题。我不记得专门这样做了,但我可能已经更改了用于绑定到服务的集线器名称至少一次。这可能是服务无法正常工作的原因。不过,从头开始解决了这个问题。

于 2019-07-12T23:01:36.883 回答