Я добавил следующий код в Startup.cs
, чтобы добавить службу Azure signalR.
services.AddSignalR().AddAzureSignalR(options =>
{
options.ConnectionString = URL_TO_SIGNALR_SERVICE;
});
app.UseAzureSignalR(options => {
options.MapHub<SignalRHub>("/signalRRoute");
});
Это мой SignalRHub.cs
код
public class SignalRHub : Hub
{
public override async Task OnConnectedAsync()
{
await base.OnConnectedAsync();
logger.LogInformation($"{Context.ConnectionId} is Connected.");
}
public override async Task OnDisconnectedAsync(Exception exception)
{
await base.OnDisconnectedAsync(exception);
logger.LogInformation($"{Context.ConnectionId} is Disconnected.");
}
public async void Execute(Model model)
{
logger.LogInformation($"{Context.ConnectionId} invoked Execute");
try
{
var data = await completeExecuteRequest(model);
Context.clients.Client(Context.ConnectionId).SendAsync("resultMethod", data);
}
catch (Exception e)
{
Context.clients.Client(Context.ConnectionId).SendAsync("errorMethod", e.Message);
}
}
}
Это развернуто на App Service
в Azure.
Служба приложений имеет несколько слотов, поэтому мы используем разные маршруты для каждого слота, например /signalRRouteDev
/signalRRouteTest
и т. Д.
Однако соединения по-прежнему становятся мультиплексными. Например, клиент слота test
должен использовать метод Execute
на сервере test
. Вместо этого он кажется очень случайным и использует метод Execute
в любом из слотов.
Когда я использую разные имена классов, такие как SignalRHubDev:Hub
SignalRHubTest:Hub
, соединение попадает на нужный сервер.
Я хочу использовать одно и то же имя класса SignalRHub
во всех слотах, чтобы клиент говорил с нужным сервером.