可以肯定地說,使用Web API的當前體系結構,這是一個不行。
事實上,控制器級別在堆棧中做出關於緩衝請求的決定已經太晚了。
IHostBufferPolicySelector
是全球服務,根深蒂固的低進棧地 - 成HttpControllerHandler
,這是網絡API的心臟(它只是一個HTTP處理程序)。所以它是不可能適用於你想要的特定請求。
在裏面HttpControllerHandler
的內部方法每個請求做什麼的Web API是這樣的:
// 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.NET Web堆棧的Codeplex問題列表中記錄這個問題列表,但現在你必須使用一個全局的IHostBufferPolicySelector
設置。
我想它可以來實現,該方式是,該組件必須被掃描爲[NoBuffer]在啓動屬性,和一些靜態配置必須與地圖上的URL來創建用於該緩衝不應該發生。然後,在最低級別HttpControllerHandler
中,必須將此映射與傳入的請求url進行比較以確定緩衝策略。