我正在尝试IHostBufferPolicySelector
基于自定义属性实现(C# 和 Web API)。即,我想根据控制器方法的属性确定是否应该缓冲请求。像这样:
[NoBuffer]
[HttpPost]
public void UploadData()
{
// Read from the stream here...
}
我如何实现这一目标?我的 IHostBufferPolicySelector 实现需要一些方法来确定 NoBuffer 属性是否存在。
我正在尝试IHostBufferPolicySelector
基于自定义属性实现(C# 和 Web API)。即,我想根据控制器方法的属性确定是否应该缓冲请求。像这样:
[NoBuffer]
[HttpPost]
public void UploadData()
{
// Read from the stream here...
}
我如何实现这一目标?我的 IHostBufferPolicySelector 实现需要一些方法来确定 NoBuffer 属性是否存在。
可以肯定地说,使用当前的 Web API 架构是不行的。
事实上,控制器级别在堆栈中为时已晚,无法做出有关缓冲请求的决定。
IHostBufferPolicySelector
是一个全局服务,在堆栈中尽可能低地根深蒂固 - into 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 进行比较以确定缓冲策略。