Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 聊天-获取新消息的最佳方式_C#_Javascript_Asp.net_Wcf - Fatal编程技术网

C# 聊天-获取新消息的最佳方式

C# 聊天-获取新消息的最佳方式,c#,javascript,asp.net,wcf,C#,Javascript,Asp.net,Wcf,我正在使用AJAXWCF服务开发一个Asp.Net聊天。这是一个非常简单的聊天引擎,其中消息对话框意味着一对一(单个用户),但是我不知道如何(以最佳方式)管理新消息可用性的通知。 例如,假设以下场景: 每当我需要从一个用户向另一个用户发送新消息时,我都会编写如下javascript代码: // btnSend client event handler MyWcfNamespace.MyWcfClass instance = new ..(); instance.CallMethod("messa

我正在使用AJAXWCF服务开发一个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图书馆使这项工作对你来说很容易。是其中之一 看看这个关于如何

更新2

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

更新3

如果您决定使用长轮询,那么您就不必使用异步方法。长轮询将如下所示

  • 将请求发送到服务器
  • 等待响应到来或超时
  • 转到客户端,提出另一个请求
  • 因此,与使用异步结果(因为JS对web服务的调用已经是异步的)不同,您可以使用普通方法和线程信号发送技术,如WaitOne(用于等待新请求到来)和ManualResetEvent(用于发送信号,一些请求已经到来)

    注意,长轮询比轮询好得多,因为响应总是最新的

    查看聊天服务器的这个实现,使用

    您也可以使用它来建立持久连接


    这个例子也很有用。

    长轮询看起来像是一个wcf服务异步调用,但我不知道如何在客户端获取异步结果。此外,长轮询涉及到另一个用户应该在已建立的轮询中发送答案,但这可能是错误的,而这不是一个要求。同时我更喜欢避开外部图书馆,对我来说是一个获得新技能的好机会。还有别的办法吗?没有,我用的是WCF 4.0。好的,我将尝试轮询,但是如何通过javascript捕获异步结果呢?我已经更新了答案。使用JS,您的调用已经是异步的。您不必调用web服务的异步方法。