C# 基于自定义属性的IHostBufferPolicySelector

C# 基于自定义属性的IHostBufferPolicySelector,c#,stream,asp.net-web-api,buffer,C#,Stream,Asp.net Web Api,Buffer,我正在尝试基于自定义属性实现IHostBufferPolicySelector C和Web API。也就是说,我想根据控制器方法的属性确定是否应该缓冲请求。像这样: [NoBuffer] [HttpPost] public void UploadData() { // Read from the stream here... } 我如何做到这一点?我的IHostBufferPolicySelector实现需要某种方法来确定NoBuffer属性是否存在。可以肯定地说,在当前的Web API体

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

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

我如何做到这一点?我的IHostBufferPolicySelector实现需要某种方法来确定NoBuffer属性是否存在。

可以肯定地说,在当前的Web API体系结构中,这是不可能的

事实上,控制器级别在堆栈中太晚了,无法做出缓冲请求的决定

IHostBufferPolicySelector是一个全局服务,在尽可能低的堆栈中根深蒂固——在HttpControllerHandler中,HttpControllerHandler是Web API的核心,它只是一个HTTP处理程序。因此,要将其应用于您想要的特定请求,实际上是不可能的

Web API对HttpControllerHandler内部方法中的每个请求所做的是:

其中_bufferPolicySelector是全局配置值;因此,它基于该全局值选择缓冲区方法

我认为您可以将此作为建议的特性登录到ASP.NET Web stack的Codeplex问题列表中,但现在您必须使用一个全局IHostBufferPolicySelector设置


我认为它可以实现的方式是,程序集必须在启动时扫描[NoBuffer]属性,并且必须使用URL映射创建一些静态配置,而不应该对这些URL进行缓冲。然后,在最低级别,在HttpControllerHandler中,必须将此映射与传入的请求url进行比较,以确定缓冲策略。

可以肯定地说,在当前的Web API体系结构中,这是不可能的

事实上,控制器级别在堆栈中太晚了,无法做出缓冲请求的决定

IHostBufferPolicySelector是一个全局服务,在尽可能低的堆栈中根深蒂固——在HttpControllerHandler中,HttpControllerHandler是Web API的核心,它只是一个HTTP处理程序。因此,要将其应用于您想要的特定请求,实际上是不可能的

Web API对HttpControllerHandler内部方法中的每个请求所做的是:

其中_bufferPolicySelector是全局配置值;因此,它基于该全局值选择缓冲区方法

我认为您可以将此作为建议的特性登录到ASP.NET Web stack的Codeplex问题列表中,但现在您必须使用一个全局IHostBufferPolicySelector设置

我认为它可以实现的方式是,程序集必须在启动时扫描[NoBuffer]属性,并且必须使用URL映射创建一些静态配置,而不应该对这些URL进行缓冲。然后,在最低级别,在HttpControllerHandler中,必须将此映射与传入请求url进行比较,以确定缓冲策略

// 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();