启用Ajax的WCF服务 - 实现观察者设计模式

3
我创建了一个通知系统,每当有新的通知时会通知用户。
目前,在下面的客户端脚本中,我每秒调用一次Web服务来检测是否有新通知。如何使用启用Ajax的WCF,让它在每次有新通知时通知客户端?
是否有任何资源、建议或教程,可以实现使用启用Ajax的WCF实现观察者设计模式?
*注意:使用观察者模式可能不是实现此功能的最佳方式,非常感谢关于最佳模式(可能是我的当前实现)的任何建议。
客户端:
$(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个回答

1

你是否被绑定在使用WCF上?SignalR可能更适合这种推送通知。

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

祝好, 迪恩


我相信目前我在这个项目中只能使用WCF,但是感谢提供另一种选择。我一定会研究一下的。 - jocey

0
就我对Web模型的理解而言,除非客户端请求通知,否则服务器(WCF服务)无法通知客户端(AJAX应用程序)。这似乎是客户端和服务器之间整个请求-响应系统的核心。
我了解您需要这样做以使您的应用程序更有效率,并且有一些建议可能会有所帮助:
  • HTTP轮询双工WCF通道 - 这并不完全符合您的要求,因为客户端仍然会轮询客户端的更改(通知)。但是,它是为您的应用程序量身定制的。
  • 如果您不能/不想使用基于轮询的WCF并坚持使用当前机制,我建议您将服务从POST更改为GET,因为显然在获取通知时不必发送任何复杂数据。在AJAX场景中,GETPOST快一点。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接