2016-07-26 5 views
0

のは、私は私のASP.NET WebAPIのアプリケーションでは、次のApiControllerがあるとしましょう:WebAPIのコントローラの再利用

class MyApiController : ApiController 
{ 
    private string str; 

    [HttpGet] 
    public string SetStr(string str) 
    { 
     this.str = str; 
     MaybeSleep(); // Some executions take longer, some don't. 
     return this.str; 
    } 
} 

(リアリティは少し複雑ですが、これは重要なことのすべてでなければなりません)

はこれがあります私の環境などでうまく動いていて、サーバー負荷が重い場合でも常に入力値を返します。

しかし、2つの環境では、サーバーの負荷があまり高くなくても、str は時々セットとリターンの間で「魔法のように」変化します。ただし、常にその時刻にサーバーに送信された値に変更されます。

だから、私の質問は以下のとおりです。

  • ApiController私はちょうどサーバープロセスを期待しなければならない、またはすべての単一の要求に対して新しいApiController、作成に使用して破棄しなければならない行動を再利用しますか?
  • この動作は、ASP.NETのバージョン、IISのバージョン、Web.configの設定によって異なりますか?
  • Microsoftから入手できるプライベートApiController変数の動作に関するドキュメントはありますか?
  • これはおそらく、特定の.NETまたはASP.NETバージョンの既知のバグですか?
+2

あなたは、共有リソースが干渉していない限り、これを分離する必要があるように、新しいコントローラは、要求ごとに作成されます。 –

+1

私はあなたの例が間違っていて、実際の状況を反映していないと確信しています。まず第一に、コントローラーをそのように再利用することはできないと思います(もし私が本当に私のプロジェクトのいくつかを心配することができたら)。二番目に再利用されたかどうかは、引数を返すだけです。フィールドを一種のローカル変数として使用しています。 – Stilgar

+0

複数の呼び出しで同じApiControllerリファレンスを使用している場合を除きます。 (グローバルコントローラを作成してメソッドを呼び出すと、すべての呼び出しに対して属性が書き換えられます)、あなたは良いことがあるはずです。そして、スティルガーが言ったように、これはおそらく全体の状況ではないでしょうし、おそらくもっとそれがあるようです。 –

答えて

1

要求は、コントローラの状態を変更するべきではありません。入力メソッドから呼び出される他のメソッドには、必要に応じてパラメータを渡すことができるため、要求に応じてコントローラオブジェクト自体を変更する必要はありません。

リクエストを通じて、他のメソッドにパラメータを渡すことができない状態がある場合は、そのリクエストに常に固有のものであるため、最も適切な場所はHttpContextです。 (それでも、そのシナリオはあまり一般的ではないでしょう。これに代えて)

public string SetStr(string str) 
{ 
    this.str = str; 
    MaybeSleep(); // Some executions take longer, some don't. 
    return this.str; 
} 

この:

public string SetStr(string str) 
{ 
    HttpContext.Items["str"] = str; //I'd declare a constant for "str" 
    MaybeSleep(); 
    return HttpContext.Items["str"]; 
} 
+0

あなたの最初の文をバックアップするためのリンクがありますか? 3つのコメントだけでなく、他の答えと矛盾しているようです。 – Alexander

+0

いいえ、私はしません。私はまた、他のコメントに全く同意しません - 私の答えは補完的です。コントローラーがリクエストから何らかの状態を取ることはできないが、それはグレインに反しているというルールはありません。あなたのコントローラがステートレスな場合は、再利用されているかどうか心配する必要はありません。 –

1

ApiControllerは、私はちょうど期待しなければならない、または が新しいApiController、作成に使用し、すべての 単一のリクエストサーバプロセスのために破壊されなければならない行動を再利用しますか?

要求が受信されると、新しいコントローラインスタンスがControllerFactoryまたはDependencyResolverによって作成されます。

基本的に、メインスレッドはコントローラインスタンスを作成し、要求が完了するまで同じインスタンスが複数のスレッド間で共有されます。

最初の前提が正しくないため、残りの質問はもう適切ではありません。

理想的には、長期実行プロセスを実行する場合は、スケジューラを使用してUIがフリーズしないようにすることをお勧めします。

あなたはスコットHanselman氏のブログで詳細を読むことができます - How to run Background Tasks in ASP.NET

関連する問題