这是一个有趣的问题.我会尽力给出一些一般性的建议.
需要考虑的几件事:
默认情况下,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;
在-http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/之前,我已经在博客中详细介绍了如何在WebAPI中处理大型文件,希望你会发现这很有用.
2)其次,如果您使用HttpClient
,那么在.NET4中,默认情况下它会缓冲请求正文,所以您应该真正使用.NET4.5.
如果你必须使用.NET 4您必须直接与HttWebRequest
合作:
3).尽可能地将数据推送到客户端,如果你想这样做的话,这是绝对可能的,PushStreamContent
.
EDIT:要查看请求中的示例if PushStreamContent
,您可以查看此示例解决方案-http://aspnet.codeplex.com/SourceControl/changeset/view/bb167f0b0013#Samples/Net45/CS/WebApi/UploadXDocumentSample/ReadMe.txt