我正在使用Microsoft.Owin.Hosting自托管signalR。在开发环境中其工作正常。当我在具有1200多个客户端的生产服务器上部署时,大多数客户端上的Connection频繁掉线。下面是我的代码
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
下面是客户端日志的屏幕截图
我无法添加评论,因此发布为答案:您能否验证连接协议是否有任何区别? websocket,longpolling或服务器已发送。通常,我们面临的这种行为差异是因为未在某些计算机上启用websocket。