我正在使用启用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服务应该实现一些静态事件来管理我需要的所有通知。
任何建议将不胜感激。 谢谢。
答案 0 :(得分:4)
使用WCF你可以通过使用长轮询等技术来实现这一目标,但显然这不会很容易。关于如何
,请看example有许多JS图书馆让这个工作为你服务。 SignalR就是其中之一 关于如何
,请看Wiki更新2
如果您使用的是Wcf 4.5,另一种完成此任务的方法是使用Web套接字。聊天应用程序需要基于推送的技术而不是基于拉取技术Wcf 4.5通过支持Web套接字为您提供此功能。 Example
更新3
如果您决定使用长轮询,那么您没有使用异步方法。长轮询将如下工作。
因此,不使用异步结果(因为从JS调用Web服务已经是异步),你可以使用常规方法和线程信令技术,如WaitOne(等待新请求到来)和ManualResetEvent用于信令,一些请求来了。
注意,长轮询远比轮询好,因为响应始终是最新的。
查看聊天服务器的这种实现答案 1 :(得分:1)
您还可以使用Websockets来建立持久连接。
同样this SignalR示例也很有用。