在我的网页上(写在 asp.net mvc3 上),用户可以在 ms sql 数据库中创建一个计划,然后需要通知用户计划完成以及一些数据作为结果。
为了检测计划完成(其唯一 id 会在完成时从表中消失),目前我正在执行 ajax 轮询,然后进行额外的 ajax 调用以从数据库中获取结果数据。
可以通过使用 SignalR 来改善这种情况吗?如果可以,如何改善?
可以通过使用 SignalR 来改善这种情况吗?如果可以,如何改善?
绝对可以改进。目前,我假设您正在执行 Ajax 轮询,但不知道何时真正需要刷新页面以显示计划完成的更新。使用 SignalR 实现,您将拥有一个使用集线器方法和客户端回调创建的服务器端集线器,以处理来自服务器集线器的回调。您不需要您的客户端轮询服务器以查看是否有任何更新。但是有些您需要在服务器内部(可能是 BG 工作人员)有一个轮询机制来检测计划完成(假设这是一个自动活动)。Signalr 不会自动执行这些操作,您需要从服务器发起呼叫到客户端集线器订阅。
就像您的场景的简单原型一样,您可以在服务器上创建一个集线器,例如:-
ScheduleHub
它可能有 2 个功能,比如CreateSchedule
和SetScheduleCompletion
。提供 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);
}
同样,事情可能会根据应用程序的复杂性而改变。这是一个非常简单的场景和实现。
如果您要使用 SignalR,您的应用程序的结构会略有变化。
例如,不是在客户端上进行 ajax 轮询,而是让您的服务器轮询或以某种方式更新已完成的时间表。
一旦 SignalR 知道计划已完成,它就可以将数据与有关计划完成的信息一起推送到您的客户端。