【问题标题】:ASP.NET MVC - Propagate a server side event to the clientASP.NET MVC - 将服务器端事件传播到客户端
【发布时间】:2013-05-25 07:04:54
【问题描述】:

在我的 ASP.NET MVC 应用程序中,用户单击 UI 上的按钮拨打电话。 ajax 请求发送到 MVC 应用程序,该应用程序调用电话拨号器 - 库中调用外部组件进行呼叫的方法。

如果已拨电话被呼叫的接收者终止,电话拨号器组件会通过调用其自己的类中的事件处理程序来引发事件。

我想将该事件传播到客户端,以便它可以更新其 UI。

我无法使用的选项

我查看了 JavaScript 服务器发送的事件。但是,它们与我的情况不同,在 JavaScript 服务器发送的事件中,会发生以下情况:

1) 客户端在新的套接字上向服务器发起连接。关键区别在于,客户端启动连接。

2) 连接一直保持活动状态,直到服务器或客户端想要终止它。

3) 从建立连接到客户端或服务器想要终止连接并且不再交换通知,服务器必须始终处于活动状态。这意味着每个客户端都使用一个新的套接字连接和一个新的工作线程来服务通知交换。

如果我使用服务器发送的事件,我将不得不创建一个保持活动状态的服务器。这意味着我必须在控制器上执行新操作,并在开始时调用相应的视图并保持活动状态,直到收到有关呼叫挂断的通知。

这不仅很昂贵,而且对我的设计也有反直觉,因为我不想仅仅为了监听事件而被重定向到新视图。

还有其他选择吗?

【问题讨论】:

标签: javascript jquery asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

您必须使用WebSocketLong polling。除了正常的 HTTP 周期之外,这些都需要您建立从客户端到服务器的连接。你还能期待什么?当页面被发送时,客户端和服务器之间的通信就完成了。 HTTP 周期结束,没有更多数据可以通过。新连接需要来自客户端,因为客户端不允许任意传入连接。

【讨论】:

    【解决方案2】:

    我认为在正常情况下没有其他选择。

    SignalR 等都需要连接处于活动状态或由客户端定期重新启动。我不知道有任何东西允许服务器启动与浏览器的连接(由于代理/防火墙等原因,它在技术上甚至看起来都不可能)。

    【讨论】:

    • 谢谢,安德烈。我知道服务器不可能启动与客户端的 TCP 连接。这是不可能的,因为客户端无法保证静态 IP,有时甚至无法获得客户端的 IP。这是我多年来一直在努力解决的一个经典问题。我并不是在暗示这是问题所在。我的意思是说,客户端维护一个额外的 TCP 连接并调用另一个操作来打开连接并让它一直存在直到收到通知是很昂贵的。
    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多