我正在使用MVC3,Razor,C#4,jQuery开发一个Web应用程序。
在一个屏幕(页面)中,我对控制器操作进行AJAX调用以获得一些屏幕更新。使用Javascripts setTimeout()我进行轮询。
在服务器没有屏幕更新的情况下优化此轮询我喜欢延迟HTTP响应并等待一段时间直到我a)获得屏幕更新或b)达到一些超时(例如10秒左右) )。
我试图做这样的事情
[OutputCache(Duration = 0)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CheckForUpdates()
{
var startTime = DateTime.Now;
while (_haveUpdates || DateTime.Now > startTime.AddSeconds(10 ))
{
Thread.Sleep(3);
}
return _haveUpdate ? Json(new {updates = ... }, JsonRequestBehavior.AllowGet) : null;
}
在视图中我使用Javascript / jQuery:
<script>
$(function () {
scheduleNextCheck();
});
function scheduleNextCheck() {
setTimeout(function() {
$.ajax({
url: "@Url.Action("CheckForUpdates")",
dataType: 'json',
data: null,
timeout: 10000,
cache: false,
success: function(data) {
if (data != null && data.updates != null ) {
// Apply Updates
} else {
scheduleNextCheck();
}
},
error: function() {
scheduleNextCheck();
}
});
}, 2000);
}
使用此代码时,IIS7工作进程将完全挂起/冻结,因此只有杀死工作进程才能解锁整个IIS7服务器。所以Thread.Sleep()似乎不是一个好主意。至少不是我的应用程序环境。
有没有人用ASP.Net MVC做这样的事情还是有任何想法?
Thx,Marc
====更新:====
发现其中一个问题:虽然标准错了。它应该是这样的:
while (noUdates && DateTime.Now < startTime.AddSeconds(10))
现在的问题是,当这个睡眠延迟循环正在运行时,其他AJAX请求被取消。
关于SignalR:必须仔细看看,但问题是这需要额外的服务器端和客户端库,我必须获得批准,所以我希望“简单”小型解决方案,影响较小,培训需求较少。 但SignalR仍然是下一个版本之一的选项,可以取代民意调查 - 但需要先获得一些培训和经验。
====更新2:====
我正在寻找一种没有额外库/框架的解决方案,因此我可以将它应用于几乎完成的Web应用程序而不会产生巨大影响。
答案 0 :(得分:5)
您可以查看专为此类情况设计的SignalR。客户端不是通过多个HTTP请求轮询服务器,而是在更新可用时通知客户端的服务器。
答案 1 :(得分:1)
我也在调查我的网站SignalR,我正在阅读这篇非常好的文章:http://www.dotnetcurry.com/ShowArticle.aspx?ID=780。
根据我的理解,唯一真正的限制是浏览器版本,但SignalR降级以适应旧版本。
这里也有一些信息:http://www.entechsolutions.com/browser-alerts-with-asp-net-4-5-and-signalr