1

MVC3、Razor、C# 4、jQuery を使用して Web アプリケーションを開発しています。

1 つの画面 (ページ) 内で、コントローラー アクションへの 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、マーク

==== 更新: ====

問題の 1 つが見つかりました: 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 に答える