我正在尝试基于自定义属性实现IHostBufferPolicySelector
(C#和Web API)。即我想根据控制器方法的属性确定是否应该缓冲请求。像这样:
[NoBuffer]
[HttpPost]
public void UploadData()
{
// Read from the stream here...
}
我如何实现这一目标?我需要一些方法让我的IHostBufferPolicySelector实现来确定是否存在NoBuffer属性。
答案 0 :(得分:4)
可以肯定地说,使用当前的Web API架构是不行的。
实际上,控制器级别在堆栈中为时已晚,无法做出有关缓冲请求的决策。
IHostBufferPolicySelector
是一个全局服务,尽可能低到堆栈 - 进入HttpControllerHandler
,这是Web 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]属性,并且必须使用地图创建一些静态配置不应该缓冲的网址。然后,在最低级别,在HttpControllerHandler
中,必须将此映射与传入的请求URL进行比较,以确定缓冲策略。