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と比較して、バッファリングポリシーを決定する必要があります。