IHostBufferPolicySelector

IHostBufferPolicySelector

我试图基于自定义属性实现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进行比较以确定缓冲策略。

10-04 14:21