聊天 - 获取新消息可用性的最佳方式

时间:2012-08-03 04:37:22

标签: c# javascript asp.net wcf

我正在使用启用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服务应该实现一些静态事件来管理我需要的所有通知。

任何建议将不胜感激。 谢谢。

2 个答案:

答案 0 :(得分:4)

使用WCF你可以通过使用长轮询等技术来实现这一目标,但显然这不会很容易。关于如何

,请看example

有许多JS图书馆让这个工作为你服务。 SignalR就是其中之一 关于如何

,请看Wiki

更新2

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

更新3

如果您决定使用长轮询,那么您没有使用异步方法。长轮询将如下工作。

  1. 将请求发送到服务器。
  2. 等到响应来了,或者超时
  3. 转到客户端,再提出请求。
  4. 因此,不使用异步结果(因为从JS调用Web服务已经是异步),你可以使用常规方法和线程信令技术,如WaitOne(等待新请求到来)和ManualResetEvent用于信令,一些请求来了。

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

    使用Wcf and Long Polling

    查看聊天服务器的这种实现

答案 1 :(得分:1)

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

同样this SignalR示例也很有用。