Мы оцениваем, как отправлять сообщения подключенным клиентам через SignalR.Наше приложение опубликовано в Azure и имеет несколько экземпляров.Мы можем успешно передавать сообщения клиентам, подключенным к одному и тому же экземпляру, но не к другим экземплярам.
Изначально мы рассматривали ServiceBus, но мы (возможно, по ошибке) выяснили, что AzureSignalR в основном должна быть служебной шиной, котораяобрабатывает весь бэкэнд для нас.
Мы устанавливаем signalR в Startup.cs, например:
public void ConfigureServices(IServiceCollection services)
{
var signalRConnString = Configuration.GetConnectionString("AxiomSignalRPrimaryEndPoint");
services.AddSignalR()
.AddAzureSignalR(signalRConnString)
.AddJsonProtocol(options =>
{
options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAzureSignalR(routes =>
{
routes.MapHub<CallRegistrationHub>("/callRegistrationHub");
routes.MapHub<CaseHeaderHub>("/caseHeaderHub");
routes.MapHub<EmployeesHub>("/employeesHub");
});
}
Issue Мы должны хранить некоторые объекты, которые, вероятно, должны быть на служебной шине, а не храниться в отдельном экземпляре;Однако я не уверен, как сказать концентратору, что объекты должны находиться на шине, а не быть внутренними для этого конкретного экземпляра концентратора, как показано ниже:
public class EmployeesHub : Hub
{
private static volatile List<Tuple<string, string, string,string, int>> UpdateList = new List<Tuple<string, string, string,string,int>>();
private static volatile List<Tuple<string, int>> ConnectedClients = new List<Tuple<string, int>>();
}
У нас есть функции, которые должны отправлять сообщениявсем подключенным клиентам, которые просматривают текущую запись, независимо от того, в каком экземпляре они находятся:
public async void LockField(string fieldName, string value, string userName, int IdRec)
{
var clients = ConnectedClients.Where(x => x.Item1 != Context.ConnectionId && x.Item2 == IdRec).Select(x => x.Item1).Distinct().ToList();
clients.ForEach(async x =>
{
await Clients.Client(x).SendAsync("LockField", fieldName, value, userName, true);
});
if (!UpdateList.Any(x=> x.Item1 == Context.ConnectionId && x.Item3 == fieldName && x.Item5 == IdRec))
{
UpdateList.Add(new Tuple<string, string, string,string,int>(Context.ConnectionId,userName, fieldName, value, IdRec));
}
}
Это не работает для разных экземпляров (что имеет смысл, поскольку каждый экземпляр будет иметь свои собственные объекты).Однако мы надеялись, что с помощью AzureSignalR вместо SignalR (строка коннекта AzureSignalR имеет конечную точку для службы Azure), что она будет обрабатывать функциональность служебной шины для нас. Мы не уверены, какие шаги необходимо предпринять, чтобы обеспечить правильное функционирование.
Спасибо.