这是一个有趣的问题。我会尽力提供一些一般性的指示。
有几点需要考虑:
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,它会默认缓冲请求正文,因此您应该真正使用 .NET 4.5。
如果您必须使用 .NET 4,您必须HttWebRequest
直接使用: - http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.allowreadstreambuffering.aspx
- http://msdn.microsoft。 com/en-us/library/system.net.httpwebrequest.allowwritestreambuffering.aspx
3)就将数据推送到客户端而言,如果您想这样做,这绝对是可能的,使用PushStreamContent
. Henrik 在这里有一篇简短的介绍性文章 - 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 -web-api/
编辑:要查看PushStreamContent
请求中的示例,您可以查看此示例解决方案 - http://aspnet.codeplex.com/SourceControl/changeset/view/bb167f0b0013#Samples/Net45/CS/WebApi/UploadXDocumentSample/ReadMe 。文本文件