1

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

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

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

4

1 回答 1

4

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

于 2013-02-21T15:09:03.017 回答