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