【问题标题】:IHostBufferPolicySelector based on custom attribute基于自定义属性的 IHostBufferPolicySelector
【发布时间】:2013-02-21 14:12:40
【问题描述】:
我正在尝试基于自定义属性实现IHostBufferPolicySelector(C# 和 Web API)。 IE。我想根据控制器方法的属性确定是否应该缓冲请求。像这样:
[NoBuffer]
[HttpPost]
public void UploadData()
{
// Read from the stream here...
}
我如何实现这一目标?我的 IHostBufferPolicySelector 实现需要一些方法来确定 NoBuffer 属性是否存在。
【问题讨论】:
标签:
c#
stream
asp.net-web-api
buffer
【解决方案1】:
可以肯定地说,使用当前的 Web API 架构是不行的。
事实上,控制器级别在堆栈中为时已晚,无法做出有关缓冲请求的决定。
IHostBufferPolicySelector 是一个全局 服务,在堆栈中根深蒂固——在 Web API 的核心HttpControllerHandler 中(它只是一个 HTTP 处理程序)。所以真的不可能像你想要的那样将它应用于特定的请求。
Web API 在HttpControllerHandler 内的internal 方法中对每个请求执行的操作如下:
// 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 进行比较以确定缓冲策略。