IHostBufferPolicySelector基于自定义属性

时间:2013-02-21 14:12:40

标签: c# stream asp.net-web-api buffer

我正在尝试基于自定义属性实现IHostBufferPolicySelector(C#和Web API)。即我想根据控制器方法的属性确定是否应该缓冲请求。像这样:

[NoBuffer]
[HttpPost]
public void UploadData()
{
  // Read from the stream here...
}

我如何实现这一目标?我需要一些方法让我的IHostBufferPolicySelector实现来确定是否存在NoBuffer属性。

1 个答案:

答案 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进行比较,以确定缓冲策略。