Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从应用服务器(.NET)到Web服务器(.NET)和从Web服务器到客户端(JS)的信号器_C#_Asp.net_Iis_Signalr - Fatal编程技术网

C# 从应用服务器(.NET)到Web服务器(.NET)和从Web服务器到客户端(JS)的信号器

C# 从应用服务器(.NET)到Web服务器(.NET)和从Web服务器到客户端(JS)的信号器,c#,asp.net,iis,signalr,C#,Asp.net,Iis,Signalr,我们运行了一个相当大的系统,使用signal对地图、图表和简单实体视图进行“实时”更新。该应用程序的业务登录与客户端通过Javascript连接到的服务器相同(基本的SignalR连接故事)。业务逻辑在我们的集线器类上触发事件,通过静态集线器上下文通知客户有关更改的信息。 在我的中心类中: 公共静态IHubContext hubContext=GlobalHost.ConnectionManager.GetHubContext(); 公共静态void static\u NotifySomethi

我们运行了一个相当大的系统,使用signal对地图、图表和简单实体视图进行“实时”更新。该应用程序的业务登录与客户端通过Javascript连接到的服务器相同(基本的SignalR连接故事)。业务逻辑在我们的集线器类上触发事件,通过静态集线器上下文通知客户有关更改的信息。 在我的中心类中:

公共静态IHubContext hubContext=GlobalHost.ConnectionManager.GetHubContext(); 公共静态void static\u NotifySomething(字符串something){ ... hubContext.Clients.All.notifySomething(某物); ... } 我的后端代码在需要时调用这些方法。(即:当位置更新到来,或业务逻辑改变某事物的状态时)

随着时间的推移,我们需要将系统重新构造为应用程序服务器和Web服务器,但仍然保持“实时”更新。 我认为保留现有的更新结构会很好,但我不能让我的客户机从Javascript访问应用程序服务器,他们现在连接到Web服务器。但是,业务逻辑调用的状态更改仍在应用服务器中发生

到目前为止的解决方案

我在应用服务器(.NET)和Web服务器(.NET)之间有一个信号器连接,其中Web服务器是客户端,查找在后端调用的事件。获取传入的事件,并调用它自己的中心类(他是服务器)并发送到连接的Javascript客户端(这里再次介绍基本的SignalR连接故事)

在我的集线器代理中:

public异步void SignalRConnectionListener(){
var hubConnection=新的hubConnection(“http://applicationServer.com");
IHubProxy myHubNotificationProxy=hubConnection.CreateHubProxy(“MyHub”);
//休息。。。
myHubNotificationProxy.On(“notifySomething”,something=>{
MyHubInWebServer.Static\u NotifySomething(something);
});
//休息。。。
等待连接。开始();
}
有了这个,我几乎不需要改变什么,我有一个所谓的hub类的副本和一个额外的代理类,它在应用程序启动时启动他的异步方法。 作为第一种选择,我将.NET客户端托管在Windows服务中,但这只会给我的维护带来更多麻烦。我更愿意将其保存在Web服务器应用程序中,除非存在严重缺陷

现在,这意味着我正在Web服务器中运行一个线程,查找应用程序服务器事件。这是个坏主意吗?有更好的解决方案吗?应用程序托管在两台服务器的IIS中。 在正常情况下(GET、POST),Web服务器通过WCF向应用程序服务器发送请求。我想我们将来会有多个Web服务器

更新


它可以与多个web服务器协同工作。我仍然不确定这是否是最好的解决办法。调试连接也不太容易。

如果我正确理解您的设计,那么您的可扩展性瓶颈将是Web服务器和应用程序服务器之间的单个活动信号器连接,用于传递通知更改消息。如果您的用户数量不断增加,该怎么办?您的单一连接只能如此快速地传播消息。您还需要更好地处理并发性。来自一台服务器上所有连接的所有通知通过漏斗传输到另一台服务器的一个连接中。如果您有很多通知,这可能是一个问题。