2013-05-16 43 views
5

私は新しいAsyncメソッドに変換したコントローラで動作が遅くなりました。それは今、それが次の文字列を返すために、しかし、任意のjQueryのAjax呼び出し、はるかに高速の代わりに完了するために、非同期のを待っているのMVC 4.5非同期Ajax呼び出しが機能しない

System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] 

を実行します。

私はここで間違っていますか?私は見つけることができるすべての例に従ってきました。これは実装するロケット科学ではありません。ほとんど

http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4#CreatingAsynchGizmos

私は非同期のHTTPを変更しないことを理解し、このビデオ

http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287

そして、このリンクに概説されているものを、その後、私は何でしたバックグラウンドで動作するAjaxコールの長時間実行を期待し、終了したときに結果をユーザーに返します。これにより、サーバーを解放して、それらをブロックするのではなく、追加のajax呼び出しを処理します。

アップデート:ここで

はjavascriptのコード

function doWork(options){ 
    return $.ajax("/getData", { 
        contentType: 'text/json', 
        async: true, 
        success: $.proxy(options.callback, options.scope), 
        error: function (jqXHR, textStatus, error) { 
         options.callback.apply(options.scope, [error, textStatus, jqXHR]); 
        } 
       }); 
} 

であり、ここではC#で、私のコントローラのアクション

[HttpGet] 
[AsyncTimeout(60000)] 
public async Task<ActionResult> GetData() 
     { 
      RestResponse<Data> response = new RestResponse<Data>(); 

      try 
      { 
       Data result = null; 

       await Task.Factory.StartNew(() => 
       { 
        result = ServerImpl.RetrieveData(); 
       }); 

       response.Value = result; 
       response.HttpStatusCode = 200; 
      } 
      catch (Exception ex) 
      { 
       response.HttpStatusCode = 500; 
       response.Value = null; 
      } 

      return Json(response, JsonRequestBehavior.AllowGet); 
     } 
+0

コントローラアクションでASP.NETセッションを使用していますか? –

+0

@ダリンはい、そうです。 – Matt

+2

それはあなたの問題です。 ASP.NETセッションでは、同じセッションからの並列要求は実行できません。 ASP.NETセッションはスレッドセーフではないため、ASP.NETは同じセッションからのサーバーへの同時アクセスを単にブロックし、待機して順次実行させます。 ASP.NETセッションでは、アプリケーションに状態や他の多くの問題が導入されています。これはデザインの匂いです。スケーラブルでステートレスなアプリケーションを作成したい場合、最初にすべきことは、それを取り除くことです。 –

答えて

12

ある問題は、サーバー側のアクションはASP.NETのセッションを使用していることですこれはスレッドセーフではないという特徴があります。結果として、ASP.NETは同じセッションからの並列要求をキューに入れ、順次実行します。 RESTfulなAPIをセッションに依存させることは非常に悪い設計であり、IMHOは状態に依存しないように再構築する必要があります。

+0

私は同じ問題があると思います。しかし、私はセッションを無効にする方法を理解していません。 web.configで既に無効にしていますが、タスクはまだ解決されていません。 –

3

セッションを使用しているときに同時にリクエストが実行されないという同じ問題があったと思います。セッションを既に変更しているわけではないので、コントローラをこの属性で飾ると、リクエストは同時に実行できます。
[SessionState(SessionStateBehavior.ReadOnly)]

関連する問題