我正在尝试在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,或者是另一种处理无缓冲上传的方法?
答案 0 :(得分:1)
你的帖子已经有点老了,但最近遇到了同样的问题。
使用Owin Host的项目(我的情况,也许是您的)使用已经完成工作的OwinBufferedPolicySelector类,因此不需要覆盖该类。
OwinContext不会将RouteData公开为HttpContextBase。
答案 1 :(得分:1)
由于您使用的是Owin,因此您已经在使用无缓冲输入,因此您无需进行任何更改。
默认情况下没有Owin,使用WebHostBufferPolicySelector
,其缓冲设置为true
输入流:
public virtual bool UseBufferedInputStream(object hostContext) {
if(hostContext == null) {
throw Error.ArgumentNull("hostContext");
}
return true;
}
当您使用Owin中间件层时,使用OwinBufferPolicySelector
而不是WebHostBufferPolicySelector
,其中所有输入流的缓冲设置为false
:
http://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();
}