WebAPI请求流支持
我正在编写一个ASP.NET Web API应用程序,它要求我接受文件上载并将该文件转发到另一个HTTP端点。
我担心如果许多用户尝试上传每个100MB的文件(这是一个有效的用例),那么我的应用程序将占用大量内存,并且根据大量请求的数量,这个占用空间可能会变大,我的应用程序会龙骨过度死亡。
理想情况下,只要Web服务器开始接收文件以显着减少服务器上的负载,我就会开始将文件流式传输到其他HTTP端点。
我确信这个过程有一个名字,但我不知道 – 这使得搜索相当艰难。
我在Web API中使用Response Streaming做了很多工作,但我以前从未考虑过请求流。
我能说的最好我需要弄清楚如何:
- 在完成上传之前开始处理流。
- 使用HttpClient流式传输相同的请求,以将相同的数据流式传输到另一个HTTP端点。
任何人都可以给我一些指示吗?
这是一个有趣的问题。 我会尽力给出一些一般性的指示。
几件事情要考虑:
1)默认情况下,Web API会缓冲请求,因此您担心内存占用可能会很大,这绝对是合理的。 您可以强制Web API在流模式下处理请求:
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; } public override bool UseBufferedOutputStream(HttpResponseMessage response) { return base.UseBufferedOutputStream(response); } }
然后更换服务:
GlobalConfiguration.Configuration.Services.Replace(typeof(IHostBufferPolicySelector), new NoBufferPolicySelector());
请注意,由于此时WebHost和SelfHost之间存在差异,因此只能在WebHost中进行此类更改。 如果您的端点是selfHosted,则必须在GlobalConfig级别设置流模式:
//requests only selfHostConf.TransferMode = TransferMode.StreamedRequest; //responses only selfHostConf.TransferMode = TransferMode.StreamedResponse; //both selfHostConf.TransferMode = TransferMode.Streamed;
我之前在博客上发表了关于在Web API中处理大型文件的更多详细信息 – http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/你会发现它很有用。
2)其次,如果你使用HttpClient
,在.NET 4中它默认缓冲请求体,所以你应该真的使用.NEt 4.5。
如果你必须使用.NET 4,你必须直接使用HttWebRequest
: – http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.allowreadstreambuffering.aspx – http://msdn.microsoft .COM / EN-US /库/ system.net.httpwebrequest.allowwritestreambuffering.aspx
3)至于将数据推送到客户端,如果你想这样做,使用PushStreamContent
肯定是可能的。 Henrik在这里有一篇简短的介绍性post – http://blogs.msdn.com/b/henrikn/archive/2012/04/23/using-cookies-with-asp-net-web-api.aspx (它基于Web API RC位,所以你可能需要调整一些签名等。)我还在博客上写了关于推送流数据的块 – http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net织网的API /
编辑:要查看请求中的PushStreamContent
示例,您可以查看此示例解决方案 – http://aspnet.codeplex.com/SourceControl/changeset/view/bb167f0b0013#Samples/Net45/CS/WebApi/UploadXDocumentSample/的ReadMe.txt
- 将null赋给可空int时出错 – “值’null’对于属性无效”
- 当客户端连接到’localhost’上的服务时,为什么System.Net.ServicePoint.ConnectionLimit使用’7FFFFFFF’(Int32.MaxValue / 2147483647)?
- 名称标记">需要使用正则表达式从字符串中删除名称标记
- C#,如何在foreach循环中生成新的html Div?
- asp.net下的Process.Start()?
- page_load和onLoad之间的区别
- 活动目录UserPrincipal.Current.GetGroups()返回本地而非Web服务器上的组
- Datediff在2个日期之间获取日期并将其绑定到gridview
- 基于浏览器加载不同的css文件