1

我正在使用 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 做过这样的事情吗?或者有任何想法吗?

谢谢,马克

==== 更新:====

发现问题之一:while 条件错误。它应该是这样的:

    while (noUdates && DateTime.Now < startTime.AddSeconds(10))

现在的问题是其他 AJAX 请求在此睡眠延迟循环运行时被取消。

关于 SignalR:必须仔细研究,但问题是这需要额外的服务器和客户端库,我必须获得批准,所以我希望有一个“简单”的小型解决方案,影响更小,培训需求更少. 但是 SignalR 仍然是下一个版本中替代轮询东西的一个选项 - 但需要首先获得一些关于这些东西的培训和经验。

==== 更新 2:====

我正在寻找一种无需额外库/框架即可工作的解决方案,因此我可以将其应用于几乎完成的 Web 应用程序而不会产生巨大影响。

4

2 回答 2

5

您可以查看专为此类情况设计的SignalR 。与其让客户端通过多个 HTTP 请求轮询服务器,不如由服务器在更新可用时通知客户端。

于 2012-06-21T14:01:57.127 回答
1

我也在用我的网站研究 SignalR,我正在阅读这篇非常好的文章:http ://www.dotnetcurry.com/ShowArticle.aspx?ID=780 。

据我了解,唯一真正的限制是浏览器版本,但 SignalR 会降级以适应旧版本。

这里也有一些信息:http ://www.entechsolutions.com/browser-alerts-with-asp-net-4-5-and-signalr

于 2012-06-21T14:27:00.923 回答