1

IHostBufferPolicySelectorカスタム属性に基づいて(C#およびWeb API)を実装しようとしています。つまり、コントローラーのメソッドの属性に基づいて、リクエストをバッファリングする必要があるかどうかを判断したいと思います。このような:

[NoBuffer]
[HttpPost]
public void UploadData()
{
  // Read from the stream here...
}

どうすればこれを達成できますか?IHostBufferPolicySelectorの実装で、NoBuffer属性が存在するかどうかを判断する方法が必要です。

4

1 に答える 1

4

Web APIの現在のアーキテクチャでは、それは失敗だと言っても過言ではありません。

実際、コントローラーレベルはスタック内で遅すぎて、要求のバッファリングについて決定を下すことができません。

IHostBufferPolicySelectorグローバルサービスであり、スタックのできるだけ低い位置に組み込まれていますHttpControllerHandler。これは、Web APIの心臓部です(単なるHTTPハンドラーです)。したがって、特定のリクエストに適用することは実際には不可能です。

内部メソッド内のすべてのリクエストでWebAPIが行うことHttpControllerHandlerは、次のとおりです。

// Choose a buffered or bufferless input stream based on user's policy
    IHostBufferPolicySelector policySelector = _bufferPolicySelector.Value;
    bool isInputBuffered = policySelector == null ? true : policySelector.UseBufferedInputStream(httpContextBase);
    Stream inputStream = isInputBuffered
                            ? requestBase.InputStream
                            : httpContextBase.ApplicationInstance.Request.GetBufferlessInputStream();

ここ_bufferPolicySelectorで、はグローバル構成値です。そのため、そのグローバル値に基づいてバッファアプローチを選択します。

これをASP.NETWebスタックのCodeplex問題リストに提案された機能として記録できると思いますが、今のところ、1つのグローバルIHostBufferPolicySelector設定を使用する必要があります。

私が想像する方法は、起動時にアセンブリで[NoBuffer]属性をスキャンする必要があり、バッファリングが発生しないURLのマップを使用して静的構成を作成する必要があるということです。次に、最下位レベルで、HttpControllerHandlerこのマップ内の着信要求URLと比較して、バッファリングポリシーを決定する必要があります。

于 2013-02-21T15:09:03.017 に答える