支持Ajax的WCF服务 - 实现Observer设计模式

时间:2012-07-22 18:16:31

标签: c# asp.net ajax wcf observer-pattern

我创建了一个通知系统,每次有新通知时都会通知用户。

目前在我的客户端脚本中,我每秒都会调用Web服务调用来ping服务器以获取新通知。如果有新的通知,我怎样才能让支持Ajax的WCF通知客户端?

是否有人有任何资源,建议或教程来使用支持Ajax的WCF实现Observer设计模式?

*注意:使用Observer模式可能不是实现此方法的最佳方式,对最佳模式的建议(可能是我当前的实现)非常感谢。

客户机侧:

$(document).ready(function () {

self.setInterval("getNewNotificationsCount()", 1000);
});

function getNewNotificationsCount() {
$.ajax({
    type: "POST",
    url: site_root + "services/NotificationService.svc/json/GetNewNotificationsCount",
    contentType: "application/json; charset=utf-8",
    data: {},
    dataType: "json",
    error: function (request, error, u) {
        alert('error: ' + error);
    },
    success: function (result, status) {
        $('#hip_badge').text(result.d);
    }

});}

通知服务

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class NotificationService {

{
    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json)]
    public int GetNewNotificationsCount()
    {
        NotificationManager nm = new NotificationManager();

        return nm.getNewNotifications(GetUserName());
    }

3 个答案:

答案 0 :(得分:1)

您是否与使用WCF相关联? SignalR可能更适合此类推送通知。

更新:只是为了澄清; SignalR抽象了一种服务器将数据推送到多个客户端的机制,其中一个客户端是JavaScript。在客户端上,您可以挂钩事件处理程序,处理通知管理器发送的通知 ...

干杯, 迪安

答案 1 :(得分:0)

就我对Web模型的理解而言,如果没有客户端请求通知,服务器(WCF服务)就无法通知客户端(AJAX应用程序)。这似乎是客户端和服务器之间整个请求 - 响应系统的核心。

我知道您需要这样才能提高您的应用效率,并且有一些建议可能有所帮助:

  • HTTP polling duplex WCF channel - 这并不完全符合您的要求,因为客户端仍然会轮询客户端的更改(通知)。但是,它仍然是为您的应用程序所需的量身定制的。
  • 如果您不能/不想使用基于轮询的WCF并坚持使用当前的机制,我建议您将服务从POST更改为GET,因为显然,您不会必须在获取通知时发送任何复杂数据。在AJAX场景中,GETPOST快一点。

答案 2 :(得分:0)

这可以在新版本的WCF(4.5)中实现。您可以使用Websockets与HTTP客户端进行双向通信。你不会再使用AJAX,而是使用带有websockets的javascript。有关详细信息,请查看以下链接:http://www.codeproject.com/Articles/338789/What-s-new-in-WCF-4-5-WebSocket-support-Part-1-of