![](/img/trans.png)
[英]How to create url route for specific Controller and Action in asp.net mvc3
[英]How to delay a controller action result in ASP.Net MVC3 C#4
我正在使用MVC3,Razor,C#4,jQuery开发Web应用程序。
在一个屏幕(页面)内,我对控制器动作进行AJAX调用以获取一些屏幕更新。 使用Java脚本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,马克
====更新:====
发现问题之一:while标准不正确。 应该是这样的:
while (noUdates && DateTime.Now < startTime.AddSeconds(10))
现在的问题是,在此睡眠延迟循环运行时,其他AJAX请求被取消了。
关于SignalR:必须仔细看一下,但是问题是,这需要我必须获得批准的其他服务器和客户端库,因此我希望找到一种“简单”的小型解决方案,其影响较小且不需要培训。 但是SignalR仍然是下一个版本中替代轮询的选项,但是首先需要获得一些培训和经验。
====更新2:====
我正在寻找一种无需其他库/框架就能工作的解决方案,因此我可以将其应用到即将完成的Web应用程序中而不会产生太大影响。
您可以看一下专门针对此类情况设计的SignalR 。 当更新可用时,服务器会通知客户端,而不是让客户端通过多个HTTP请求轮询服务器。
我也在我的网站上研究SignalR,正在阅读这篇非常不错的文章: http : //www.dotnetcurry.com/ShowArticle.aspx ?ID=780。
据我了解,唯一真正的限制是浏览器版本,但是SignalR会降级以适应旧版本。
这里也有一些信息: http : //www.entechsolutions.com/browser-alerts-with-asp-net-4-5-and-signalr
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.