2016-09-26 4 views
5

従来のMVC 5 Webアプリケーションでは、長時間実行されているアクションにajaxコールをかけるボタンをクリックした後でもブラウジングを続行できるようにしたいと考えています。なぜajaxコールの後に他のページを参照できないのですか?

注:アクションがvoidを返します - 私は応答に興味を持っていないです)

私はアクションが完了するまで、他のすべての要求を行うことができませんボタンをクリックします。

編集:ここでははAjaxコードです:

$('#EmailReport') // 
    .click(function() { 
     $.ajax({ 
      type: "POST", 
      url: '/Home/EmailReport', 
      complete: function() {console.log("done")}, 
      async: true 
     }); 
    }); 

コントローラ

[HttpPost] 
public async Task EmailReport() 
{ 
    // for testing - sleep for 10 seconds 
    await Task.Delay(TimeSpan.FromSeconds(10)); 
} 

ここでは、クロームのdevのツールでスクリーンショットです:

Ajax request

EmailReportは、AJAX呼び出しで、下部の2つの要求は、私は別のページを参照しようとしている - あなたが最初の要求を見ることができるように、誰もが任意のアイデアをどのように私を持っていますpendingであり、任意の後続の要求はcancelled

ですこの問題を解決またはトラブルシューティングできますか?

+0

クライアントに焦点を当てるのではなく、サーバーを見てください。長時間実行されるアクションは、サーバーの処理中にサーバーを完全に閉鎖しますか? –

+0

'EmailReport'アクションでスレッドを作成します。このアクションは、バックグラウンドで実行され、HTTP 200応答を返します。経由での応答を待つことはありません。 AJAX。 –

+0

これは、ローカルマシンで発生します。このマシンでは、前回の処理が完了するまで、IISは結果の要求を処理しません。 –

答えて

1

次のように簡単な方法は、次のようになります。

Task t = new Task(() => TimeSpan.FromSeconds(10)); 
t.Start(); 

コアの親和性と優れたCPU使用率を回避するために、長時間実行されるジョブのためのスレッドと比較して、タスクを使用することをお勧めします。

+0

こちらをご覧ください... –

0

使用し、バックグラウンド・プロセス

[HttpPost] 
public JsonResult EmailReport() 
{ 
    Thread email= new Thread(delegate() 
    { 
      generatereports(); 
    }); 
    email.IsBackground = true; 
    email.Start(); 
    return null; 
} 
+0

こんにちは、あなたの返信ありがとうございます。残念ながら私はこのコードを使用して同じ問題を抱えています –

2

問題は、あなたのアクションは、タスクの完了を待つ、ということです。タスクを開始するとすぐに待機して復帰しないでください。それはページのリダイレクト要求と古いページがあるので、あなたの要求はキャンセルされ

[HttpPost] 
public void EmailReport() 
{ 
    // for testing - sleep for 10 seconds 
    var myTask = Task.Delay(TimeSpan.FromSeconds(10)); 
    myTask.Start(); 
} 

は新しいものが発行されたときにリクエストがキャンセルされているリダイレクト(あなたがリンクを2回クリックしたときに、例えば、最初のクリックは無視されます)。それはブラウザがそれを実装する方法です。それはあなたの問題の根とは関係ありません。

+0

あなたの答えをありがとう - 私はこの変更を加えましたが、devツールネットワークタブのajax呼び出しを見ると、私は500エラーを受け取りますか? –

+0

あなたは例外を投稿できますか?例外は 'Server.GetLastError()'を使って 'Global.asax'の' Application_Error'メソッドで見つけることができます。 https://forums.asp.net/t/1926670.aspx?How+to+get+last+exception –

0

Navigator.sendBeacon() apiがあなたの目的を果たすようです。少数のデータをHTTP経由でWebサーバーに非同期に転送するために使用されます。これは実験的な技術で、Chrome 39+、Firefox 31+、opera 26+でサポートされていますが、他のブラウザではpolyfillがあります。

関連する問題