Я использую собственный хостинг signalR с помощью Microsoft.Owin.Hosting. Хорошо работает в среде разработки. Когда я развертывался на производственном сервере, имеющем более 1200 клиентов, соединение на большинстве клиентов часто прерывалось. Ниже мой код
public void Configuration(IAppBuilder app)
{
try
{
Trace.WriteLine("Server starting", "Configuration");
SqlDataAccess dataAccess = new SqlDataAccess();
string sqlConnectionString = "Data Source=" + SqlDataAccess.dbServerName + "; Initial Catalog= " + ConfigurationManager.AppSettings["BackPlaneDb"] + ";user id =" + SqlDataAccess.dbUsername + ";password=" + SqlDataAccess.dbPassword; //ConfigurationManager.ConnectionStrings["BackPlaneConnectionString"].ConnectionString;//.AppSettings["BackPlaneConnectionString"];//
GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString);
app.UseCors(CorsOptions.AllowAll);
GlobalHost.HubPipeline.AddModule(new ErrorPipeline());
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true,
};
app.MapSignalR(hubConfiguration).MaxConcurrentRequests(2000);
dataAccess.Dispose();
Trace.WriteLine("Server started", "Configuration");
}
catch (Exception ex)
{
Logs.Add(ex, 0, "Configuration");
}
}
Это файл SignalRWinService.cs
public partial class SignalRWinService : ServiceBase
{
private IDisposable SignalR { get; set; }
public string ServerURI = ConfigurationManager.AppSettings["ServerURI"];
public SignalRWinService()
{
InitializeComponent();
}
public void Start()
{
this.OnStart(null);
}
protected override void OnStart(string[] args)
{
Task.Run(() => StartServer()).Wait();
}
private void StartServer()
{
try
{
SignalR = WebApp.Start(ServerURI);
}
catch (Exception ex)
{
Logs.Add(ex, 0, "StartServer");
throw ex;
}
}
protected override void OnStop()
{
if (SignalR != null)
{
SignalR.Dispose();
}
}
}
Этот код предназначен для работы с сервером singalR
public class ClientConnectionHub : Hub
{
private static object lockObj = new object();
private static Dictionary<string, List<string>> _connections = new Dictionary<string, List<string>>();
private BackgroundWorker bgwSendNonExportedOrders;
ClsDbOperations clsDbOperations = new ClsDbOperations();
#region Overrides SignalR Methods
public override Task OnConnected()
{
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
var keyPair = _connections.Where(x => x.Value.Contains(Context.ConnectionId)).FirstOrDefault();
if (keyPair.Key != null)
{
keyPair.Value.Remove(Context.ConnectionId);
clsDbOperations.UpdateConnectionIds(keyPair.Key, Context.ConnectionId, false);
}
return base.OnDisconnected(stopCalled);
}
#endregion
Ниже приведен скриншотклиентских логов