Web API 2 — потоковое чтение файла

Как вы читаете только часть файла как поток в веб-API и выполняете действия над этим потоком, не занимая весь файл в памяти? NB: я не хочу сохранять файл где-либо перед чтением - он загружен на контроллер веб-API.

Но то, что я действительно хотел бы, это реализовать следующий псевдокод:

foreach file in Request
{
    using (var sr = new StreamReader(fileStream))
    {
         string firstLine = sr.ReadLine() ?? "";
         if (firstLine contains the magic I need)
         {
             // would do something with this line, 
             // then scrap the stream and start reading the next file stream
             continue; 
         }
    }
}

person Fred Johnson    schedule 24.10.2016    source источник
comment
Если файл не сохраняется, значит, это память. В противном случае у вас нет возможности прочитать файл   -  person Tinwor    schedule 24.10.2016
comment
То есть при проводке контроллер имеет весь файл в памяти с самого начала?   -  person Fred Johnson    schedule 24.10.2016
comment
Он не передает его с клиента?   -  person Fred Johnson    schedule 24.10.2016
comment
Извини, я не понимаю. Ваш псевдокод связан с загрузкой файла или чтением файла после загрузки?   -  person Tinwor    schedule 24.10.2016
comment
Загрузка - но вам не нужно читать весь поток файла, если вам нужна только первая часть   -  person Fred Johnson    schedule 24.10.2016


Ответы (1)


Как показано здесь: http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/

Вы можете «принудительно перевести веб-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);
   }
}

public interface IHostBufferPolicySelector
{
   bool UseBufferedInputStream(object hostContext);
   bool UseBufferedOutputStream(HttpResponseMessage response);
}

К сожалению, кажется, что вы не можете обойти это с помощью Web API, как упоминалось в сообщении, поскольку это сильно зависит от system.web.

person Fred Johnson    schedule 24.10.2016