并非始终使用Azure SignalR服务触发OnConnectedAsync

时间:2019-07-07 03:45:13

标签: .net-core asp.net-core-signalr azure-signalr

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

我尝试删除客户端加载的其他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);
    }
}

启动类中的ConfigureServices方法包括:

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

启动类中的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函数推送数据更新:

[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%的时间内无法完成?

1 个答案:

答案 0 :(得分:0)

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

在我的研究中,我确实读过某个地方,尝试通过多个集线器连接到服务可能会引起问题。我不记得具体做过什么,但是我可能至少更改了一次用于绑定到该服务的中心名称。 可能就是该服务无法正常运行的原因。从头开始解决了问题。