繁体   English   中英

如何在ASP.Net MVC3 C#4中延迟控制器操作结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM