聊天-获取新信息的最佳方式

Chat - Best way to fetch new message availability

本文关键字:最佳 方式 信息 获取 新信息 聊天      更新时间:2023-09-26

我正在使用启用的Ajax Wcf服务开发Asp.Net聊天。这是一个非常简单的聊天引擎,消息对话框意味着一对一(单个用户),但我不知道如何管理(以最佳方式)通知新消息的可用性。例如,假设以下场景:

每当我需要从一个用户向另一个用户发送新消息时,我都会编写这样的javascript代码:

// btnSend client event handler
MyWcfNamespace.MyWcfClass instance = new ..();
instance.CallMethod("message string", callBackFunction, null);

这很简单。现在,从另一端(将接收我的消息的用户),需要一些机制来知道何时发送了新消息。我想用ajax定时器调用另一个wcf方法,如果它可用,它会返回字符串消息,如果不可用,则返回空字符串,但我认为这是最好的方法。

如果存在通过javascript:注册某些wcf事件的某种方式,那将是非常棒的

// javascript code:
MyWcfNamespace.MyWcfClass instance = new ..();
instance.OnNewMessageAvailable = myJavascriptCallBackFunction;
// And on CallBack function..
function myJavaScriptCallbackFunction(msg) {
alert('new message arraived:' + msg):
}

显然,我的wcf服务应该实现一些静态事件来管理我需要的所有通知。

如有任何建议,我们将不胜感激。非常感谢。

使用WCF,您可以通过使用长轮询等技术来实现这一点,但显然这并不容易。看看这个关于如何的例子

有许多JS库可以让你轻松地完成这项工作。SignalR就是其中之一看看这个关于如何的Wiki

更新2

如果您使用的是Wcf 4.5,另一种完成此任务的方法是使用web套接字。聊天应用程序需要基于推送的技术,而不是基于拉取的技术。Wcf 4.5通过支持Web套接字为您提供这种功能。示例

更新3

如果您已经决定使用长轮询,那么您就不必使用异步方法。长轮询的工作方式如下。

  1. 将请求发送到服务器
  2. 等待响应或超时
  3. 转到客户端,提出另一个请求

因此,您不使用异步结果(因为从JS对web服务的调用已经是异步的),而是使用带有线程信号发送技术的普通方法,如WaitOne(等待新请求到来)和ManualResetEvent来进行信号发送,一些请求已经到来。

请注意,长轮询远比轮询好,因为响应总是最新的。

看看这个使用Wcf和长轮询的聊天服务器的实现

您还可以使用Websockets来建立持久连接。

这个SignalR的例子也很有用。