我试图基于自定义属性实现IHostBufferPolicySelector
(C#和Web API)。即我想根据控制器方法的属性来确定是否应缓冲请求。像这样:
[NoBuffer]
[HttpPost]
public void UploadData()
{
// Read from the stream here...
}
我该如何实现?我需要某种方式让IHostBufferPolicySelector实现确定NoBuffer属性是否存在。
最佳答案
可以肯定地说,使用当前的Web API架构是行不通的。
实际上,控制器级别在堆栈中为时已晚,无法做出有关缓冲请求的决定。IHostBufferPolicySelector
是一项全局服务,它已尽可能深入到堆栈中-进入了HttpControllerHandler
,这是Web API的核心(它只是一个HTTP处理程序)。因此,实际上不可能像您希望的那样将其应用于特定请求。
Web API对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.NET Web堆栈的Codeplex问题列表上,但是现在您必须使用一个全局
IHostBufferPolicySelector
设置。我想象可以实现的方式是,必须在启动时扫描程序集的[NoBuffer]属性,并且必须使用不应该进行缓冲的url映射来创建一些静态配置。然后,必须在最低级别
HttpControllerHandler
中将此映射与传入请求url进行比较以确定缓冲策略。