2

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

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

4

2 回答 2

4

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

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

更新 2

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

更新 3

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

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

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

请注意,长轮询比轮询要好得多,因为响应始终是最新的。

看看这个使用Wcf 和 Long Polling实现的 Chat Server

于 2012-08-03T04:42:35.510 回答
1

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

这个 SignalR示例也很有用。

于 2012-08-03T05:29:48.443 回答