可以肯定地说,使用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进行比较以确定缓冲策略。