在WebApi 2中的IHostBufferPolicySelector的上下文中清空RouteData

时间:2015-03-04 21:28:51

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

我正在尝试在WebApi 2中上传大文件。我正在关注this tutorial(这与webapi 2 cookbook中使用的配方相同),您注册了主机策略

public class NoBufferPolicySelector : WebHostBufferPolicySelector
{
   public override bool UseBufferedInputStream(object hostContext)
   {
      var context = hostContext as HttpContextBase;

      if (context != null)
      {
         if (string.Equals(context.Request.RequestContext.RouteData.Values["controller"].ToString(), "uploading", StringComparison.InvariantCultureIgnoreCase))
            return false;
      }

      return true;
   }
}

但是context.Request.RequestContext.RouteData基本上是一个没有路由数据集的虚拟对象。

是否有另一种方法可以从HttpBaseContext中找到webapi 2中的RouteData,或者是另一种处理无缓冲上传的方法?

3 个答案:

答案 0 :(得分:1)

你的帖子已经有点老了,但最近遇到了同样的问题。

使用Owin Host的项目(我的情况,也许是您的)使用已经完成工作的OwinBufferedPolicySelector类,因此不需要覆盖该类。

OwinContext不会将RouteData公开为HttpContextBase。

https://books.google.com.br/books?id=7aE8BAAAQBAJ&pg=PA123&lpg=PA123&dq=override+WebHostBufferPolicySelector&source=bl&ots=fvV5SWVsJG&sig=I5t4MBOXdPbgFV4mBCI_kWLWkRw&hl=pt-BR&sa=X&ei=oheIVev2N-TgsASS2IDgCQ&ved=0CD0Q6AEwAw#v=onepage&q=override%20WebHostBufferPolicySelector&f=false

答案 1 :(得分:1)

由于您使用的是Owin,因此您已经在使用无缓冲输入,因此您无需进行任何更改。

默认情况下没有Owin,使用WebHostBufferPolicySelector,其缓冲设置为true输入流:

http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http.WebHost/WebHostBufferPolicySelector.cs

public virtual bool UseBufferedInputStream(object hostContext) {
    if(hostContext == null) {
        throw Error.ArgumentNull("hostContext");
    }

    return true;
}

当您使用Owin中间件层时,使用OwinBufferPolicySelector而不是WebHostBufferPolicySelector,其中所有输入流的缓冲设置为falsehttp://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http.Owin/OwinBufferPolicySelector.cs

public bool UseBufferedInputStream(object hostContext) {
    return false;
}

答案 2 :(得分:0)

我也遇到了同样的问题,并通过评论对#34; MapHttpAttributeRoutes"的调用来解决它。 HttpConfiguration实例上的方法。我不知道它为什么干扰RouteData。

    public static void Register(HttpConfiguration config)
    {
        // Web API routes 
        //Enabling of below cause empty RoutData in NoBufferPolicySelector class.
        //config.MapHttpAttributeRoutes();
    }