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

时间:2012-06-21 13:57:00

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0 asp.net-ajax

我正在使用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应用程序而不会产生巨大影响。

2 个答案:

答案 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