OnConnectedAsync не все время запускается с помощью службы Azure SignalR - PullRequest
0 голосов
/ 07 июля 2019

У меня есть приложение .NET Core 2.2 MVC, которое использует службу Azure SignalR для получения в реальном времени обновленных данных из нескольких функций Azure.Журналы трассировки показывают все на клиенте, работающем как ожидалось.Однако, когда соединение успешно установлено, метод 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);
    }
}

Метод 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 с использованием привязки Azure SignalR (через те же библиотеки, которые упомянуты выше, а также Microsoft.Azure.WebJobs.Extensions.SignalRService 1.0.0):

[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 fiкрасный, а когда нет:

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 и не могу найти ничего плохого в своем коде.

Какой механизм может быть задействован, который только позволяет соединению клиент-сервер не завершать 100% времени,даже если подключение к службе Azure SignalR установлено успешно?

1 Ответ

0 голосов
/ 13 июля 2019

Это не совсем точный ответ, так как я до сих пор не уверен в основной причине, но проблема была решена путем создания новой службы Azure SignalR и перехода на нее.

В своем исследовании я где-то читал, что попытка подключиться к службе с несколькими концентраторами может вызвать проблемы.Я не помню, чтобы делал это конкретно, но я может изменил имя концентратора, которое использовал для привязки к сервису хотя бы один раз.Это может было причиной того, что служба не работала должным образом.Хотя с нуля исправил проблему.

...