2013-02-21 77 views
1

我試圖基於自定義屬性實現IHostBufferPolicySelector(C#和Web API)。即我想根據控制器方法中的屬性來確定請求是否應該被緩衝。像這樣:基於自定義屬性的IHostBufferPolicySelector

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

我該如何做到這一點?我需要一些方法來實現IHostBufferPolicySelector實現,以確定NoBuffer屬性是否存在。

回答

4

可以肯定地說,使用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進行比較以確定緩衝策略。

相關問題