Ответ 1
Это интересный вопрос. Я постараюсь сделать все возможное, чтобы дать некоторые общие указатели.
Немного о чем подумать:
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/library/system.net.httpwebrequest.allowwritestreambuffering.aspx
3) Что касается нажатия на данные клиенту, что определенно возможно, если вы хотите сделать это, PushStreamContent
.
Здесь у Хенрика есть короткий вводный пост - http://blogs.msdn.com/b/henrikn/archive/2012/04/23/using-cookies-with-asp-net-web-api.aspx (он основан на битах веб-API RC, поэтому вам может понадобиться настроить некоторые подписи и т.д.)
Я также писал о том, что здесь выжимают куски данных потока - http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/
EDIT: Чтобы увидеть пример, если PushStreamContent
в запросе, вы можете посмотреть это примерное решение - < а5 >