2013-02-21 79 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进行比较以确定缓冲策略。

相关问题