У меня есть приложение .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 установлено успешно?