web-dev-qa-db-ja.com

ASP.NET MVCとAjax、同時リクエスト?

AJAX初心者はこちら!
ASP.NET MVC Webアプリの現時点では、私のAJAXリクエストはバッチ処理またはキューに入れられているようですが、よくわかりません。
前のリクエストが完了するまで、リクエストは完了していないようです。
リクエストを独立して返すにはどうすればよいですか?
必ずしも誰かに答えてもらいたくはありませんが、役立つチュートリアルやリソースへのリンクがあるかもしれません。ありがとう

35
Boob

私はLachlanRocheの答えを拡張しています。それは正しいです。

ASP.NET Frameworkは、ある要求が別の要求に干渉するのを防ぐために、セッションスコープを処理する「シングルスレッド」要求(グローバルリソース)になります。 WebFormsでは、Pageディレクティブを使用して、個々のページがSessionを使用しないように指定できるため、このように同期的に処理する必要がないと思います。

問題は、ASP.NET MVCではすべての要求がSessionを使用するであるということです。これは、TempDataの実装に使用されるためです。 Lachlan Rocheが指摘したように、セッション状態を完全に無効にすることも、ケースバイケースで対処することもできます。

考えられる解決策は、独自のバックグラウンドスレッドを開始して、実行時間の長いコードを処理し、最初のリクエストができるだけ早く「完了する」ようにすることです。

38

ASP.NETは、セッションが無効として構成されているか、pages要素の enableSessionState 属性を介してweb.configで読み取り専用に構成されていない限り、セッションごとに要求をシリアルに処理します。

これはページ設定であるため、MVCコントローラーには影響せず、シリアルリクエスト処理の対象となります。

不思議なことに、セッションが無効になっている、または読み取り専用に設定されている場合でも、セッションデータの読み取りと書き込みを行うことができます。シリアルリクエスト処理を引き起こすセッションロックにのみ影響するようです。

<system.web>
    <pages enableSessionState="ReadOnly"/>
</system.web>

ページにはenableSessionStateプロパティを含めることもできますが、これはMVCビューには関係ありません。

<%@ Page EnableSessionState="True" %>
35
Lachlan Roche

ASP.MVC 3のリリースにより、コントローラーに属性を追加して、セッションを読み取り専用としてマークできるようになりました。これにより、同じクライアントからアクションを同時に呼び出すことができます。

セッションレスコントローラーのサポート:

セッションレスコントローラーは、ASP.NET MVC 3のもう1つの優れた新機能です。セッションレスコントローラーを使用すると、コントローラーのセッション動作を簡単に制御できます。たとえば、HomeControllerのセッションをDisabledまたはReadOnlyにして、単一ユーザーの同時リクエスト実行を許可できます。詳細については、 ASP.NET MVCでの同時要求 および HowTo:MVC3でのセッションレスコントローラー–何と理由? を参照してください。

-from このDZoneの記事

コントローラにSessionState(SessionStateBehaviour.Disabled)を追加することにより、ランタイムでは、同じブラウザセッションから複数のアクションを同時に呼び出すことができます。

残念ながら、アクションが呼び出されたときにのみセッションを無効にするようにアクションをマークする方法はないと思います。そのため、セッションを必要とするアクションと必要としないアクションがあるコントローラーがある場合は、別のコントローラーに移動しないものを移動します。

ASP MVCの新しいバージョンでは、SessionStateAttributeを使用して個々のコントローラークラスを装飾できます。

[System.Web.Mvc.SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MyController : Controller 
{
}
30
Andy

.NET Framework v3.0がリリースされてから、SessionStateAttributeで「SessionStateBehavior」列挙型を使用できます。

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MyController : BaseController { }
2
Odrin