【问题标题】:Continuously updating chat messages不断更新聊天消息
【发布时间】:2011-01-03 07:46:55
【问题描述】:

我正在创建一个非常简单的聊天应用程序。它有一个 ASP.NET 网页作为前端,一个 WCF 服务作为后端用于将消息存储到数据库中。

除了一件事,一切都很好;当浏览器 A 输入聊天消息时,我希望浏览器 B 尽快看到该消息(是的,我知道,这就是聊天的目的)。

到目前为止,我所做的是在 UpdatePanel 中设置一个触发器,如下所示:

<Triggers>
    <asp:AsyncPostBackTrigger ControlID="chatTimer" EventName="Tick" />
</Triggers>

使用计时器:

<asp:Timer ID="chatTimer" runat="server" OnTick="chatTimer_Tick" Interval="1000" />

这是最好的方法还是有更好但更简单的方法来完成消息的更新。此解决方案的一个缺点是每次运行 Tick 事件时,用于输入聊天消息的文本框都会失去焦点。

感谢任何有关更新消息的反馈或建议。

谢谢!

【问题讨论】:

  • 您是否考虑过在 Silverlight 中这样做?您也许可以利用套接字将更新推送到客户端,而不是每秒拉更新。
  • 目前,不,我没有。同时,你的提议听起来很不错。这实际上是我想做的。

标签: c# asp.net


【解决方案1】:

由于 HTTP 协议不支持服务器推送,因此您必须轮询服务器以进行更改。有不同的方法可以做到这一点,但它们都与您正在做的事情相似。

您可以通过设置UpdateMode="Conditional" 使更新面板的更新成为可选,这样它就不会在每个计时器滴答声中更新(并失去焦点)。仅当您在服务器端调用Update 方法触发它时才会更新。

【讨论】:

  • 谢谢,我一直在寻找这样的答案。也就是说,ASP.NET 中不提供服务器推送。
  • @Daniel:是的,但是限制是 HTTP 协议,而不是 ASP.NET 框架。 :)
【解决方案2】:

Comet 是一种用于这种场景的技术。虽然我不会说这很简单。

基本上,客户端会保持与服务器的长期连接,然后服务器可以将数据推送到浏览器。

这个问题相关:Comet implementation for ASP.NET?

【讨论】:

    【解决方案3】:

    如果您使用 WCF,您可以实现一个 CallbackContract,只要来自其他客户端的消息到达,服务器就会调用它。

    【讨论】:

    • 但是回调合约在客户端实现起来相当困难,不是吗?
    • 您只能使用 NetTcpBinding 和 NetNamedPipeBinding 来做到这一点。我认为浏览器不会支持它。他没有使用 WCF 与客户端(浏览器)进行通信。
    • 这不是真的。 WSDualHttpBinding 支持 (msdn.microsoft.com/en-us/library/…)。我知道他没有使用 WCF 与客户沟通,但我建议他这样做。
    • 我也会看看这个。
    • 你的权利,还有WSDualHttpBinding。如果我的理解是正确的,它会在客户端建立一个服务器可以连接的连接。我不确定您如何在浏览器中执行此操作,而且您还遇到了防火墙问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多