【问题标题】:IHostBufferPolicySelector based on custom attribute基于自定义属性的 IHostBufferPolicySelector
【发布时间】:2013-02-21 14:12:40
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    可以肯定地说,使用当前的 Web API 架构是不行的。

    事实上,控制器级别在堆栈中为时已晚,无法做出有关缓冲请求的决定。

    IHostBufferPolicySelector 是一个全局 服务,在堆栈中根深蒂固——在 Web API 的核心HttpControllerHandler 中(它只是一个 HTTP 处理程序)。所以真的不可能像你想要的那样将它应用于特定的请求。

    Web API 在HttpControllerHandler 内的internal 方法中对每个请求执行的操作如下:

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

    【讨论】:

      猜你喜欢
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      相关资源
      最近更新 更多