2

在我的网页上(写在 asp.net mvc3 上),用户可以在 ms sql 数据库中创建一个计划,然后需要通知用户计划完成以及一些数据作为结果。

为了检测计划完成(其唯一 id 会在完成时从表中消失),目前我正在执行 ajax 轮询,然后进行额外的 ajax 调用以从数据库中获取结果数据。

可以通过使用 SignalR 来改善这种情况吗?如果可以,如何改善?

4

2 回答 2

3

可以通过使用 SignalR 来改善这种情况吗?如果可以,如何改善?

绝对可以改进。目前,我假设您正在执行 Ajax 轮询,但不知道何时真正需要刷新页面以显示计划完成的更新。使用 SignalR 实现,您将拥有一个使用集线器方法和客户端回调创建的服务器端集线器,以处理来自服务器集线器的回调。您不需要您的客户端轮询服务器以查看是否有任何更新。但是有些您需要在服务器内部(可能是 BG 工作人员)有一个轮询机制来检测计划完成(假设这是一个自动活动)。Signalr 不会自动执行这些操作,您需要从服务器发起呼叫到客户端集线器订阅。

就像您的场景的简单原型一样,您可以在服务器上创建一个集线器,例如:-

ScheduleHub它可能有 2 个功能,比如CreateScheduleSetScheduleCompletion。提供 setScheduleCompletion 知道

在您的客户端 javascript 上,您将获得 hubConnection 实例

 var scheduleCheckHub= $.connection.scheduleHub;
//when the use
    $("#createSchedule").click(function () {
                    scheduleCheckHub.server.createSchedule(somedata);
                });

客户端集线器方法回调来处理来自服务器的回调。

scheduleCheckHub.client.updateScheduleStatus = function (data) {
              //do something
            };

您将有连接开始停止,重新连接逻辑等

 $.connection.hub.start().done(function () {
              //do something
            });
       .....

在您的服务器集线器 SetScheduleCompletion 方法中

    public void SetScheduleCompletion()
   {
 .....
//some code that knows when the schedule has been completed.
//Now i know that this schedule has been completed so
//push this to all the clients, ok then make the call back to the client hub proxy method
      Clients.All.updateScheduleStatus(responseObject); 
//No i just want to send this to only specific clients. Ok then do this
   var subscribers = Clients.Group(someIdentifierToGetGroups);
   subscribers.updateScheduleStatus(responseObject);
}

同样,事情可能会根据应用程序的复杂性而改变。这是一个非常简单的场景和实现。

于 2013-04-20T23:43:27.337 回答
1

如果您要使用 SignalR,您的应用程序的结构会略有变化。

例如,不是在客户端上进行 ajax 轮询,而是让您的服务器轮询或以某种方式更新已完成的时间表。

一旦 SignalR 知道计划已完成,它就可以将数据与有关计划完成的信息一起推送到您的客户端。

于 2013-04-20T22:22:01.290 回答