2013-04-25 3 views
1

У меня есть действие Web API ASP.NET, который создает файл и возвращает содержимое потока:Принять и загрузить содержимое потока из ASP.NET Web API с помощью HTTPClient

public HttpResponseMessage Get(string filePath) 
{ 
    // create file 
    var file = FileConverter.GenerateExcelFile(filePath); 

    var stream = new FileStream(filePath, FileMode.Open); 

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
    result.Content = new StreamContent(stream); 
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
    result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(filePath); 
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
    return result; 
} 

Я хотел бы использовать HttpClient для загрузки возвращенный файл. Вот что у меня есть сейчас:

client.GetAsync(address).ContinueWith(
     (requestTask) => 
     { 
      HttpResponseMessage response = requestTask.Result; 

      // response.EnsureSuccessStatusCode(); 

      response.Content.ReadAsStreamAsync().ContinueWith(
         (readTask) => 
         { 
          var stream = readTask.Result; 
         }); 
     }); 

Как заставить фактическую загрузку после получения результата?

Редактировать: Я использую ASP.NET 4.0 WebForms.

+0

Вы когда-нибудь узнали ответ для этого? – cjohns

+0

@cjohns нет, я не нашел ответа. – Rivka

ответ

3

Вы думали о просто звоню:

client.GetByteArrayAsync(address) 

вместо того, чтобы получить результат байтового массива, а затем просто сохранить его в поток памяти?

Edit ::

попробовать что-то вроде этого:

var contentBytes = await client.GetByteArrayAsync(address); 
Stream stream = new MemoryStream(contentBytes); 
+0

Нет, не знаю. Я просто попытался заменить мой GetAsync GetByteArrayAsync, но получил синтаксические ошибки. Просто запустить однострочный клиент.GetByteArrayAsync (адрес); бросил «одно или несколько исключений». – Rivka

+0

Спасибо, но это все еще дает мне «одну или несколько ошибок». Кроме того, я использую ASP.NET 4.0 (не 4.5). Я также попытался изменить свое действие, чтобы вернуть ByteArrayContent, но это не повлияло. Обратите внимание, что когда я вызываю веб-API, посылая URL-адрес в моем браузере, не возникает ошибка, и файл загружается и отображается в моем браузере. Просто код HttpClient, похоже, не работает. (Мой оригинальный метод не выдавал никаких ошибок.) – Rivka

1

Почему вы думаете, что загрузка не произошло?

По умолчанию, когда вы делаете GetAsync HTTP-клиент с созданием MemoryStream в качестве буфера с результатом. ReadAsStreamAsync просто возвращает этот буферизированный StreamContent.

Edit: Вы можете создать файл, как это,

using (FileStream fs = new FileStream("file.txt", FileMode.Create)) { 
      stream.CopyTo(fs); 
     } 
    } 
+0

Я не думаю, что API не вернул Stream. Мне просто нужен пользователь, чтобы получить файл ... поэтому нам нужно что-то сделать с потоком. Я не могу использовать Response.WriteFile или что-то вроде того, потому что он дает мне «Ответ в этом контексте недоступен». – Rivka

+0

Мне что-то не хватает ... Я получаю, как создать файл ... Мне нужно, чтобы он был * загружен * ... вы говорите, что не можете загрузить его в браузер по тому же запросу? Надеюсь, что моя проблема понятна. – Rivka

+0

@Rivka Я в замешательстве, вы сказали, что хотите использовать HttpClient. Но теперь вы говорите, что хотите использовать браузер. Я не понимаю ваш сценарий. –

-1

HttpClient работает на стороне сервера не в веб-браузере, так что это действительно смущает то, что вы пытаетесь достичь здесь. Если вам действительно нужно использовать HttpClient, вы можете сохранить поток результатов в поток файлов, как вы можете читать в комментариях.

Если вы хотите, чтобы файл загружался в веб-браузере, вам не нужен и не может использовать HttpClient. Как вы уже писали в комментарии, он уже работает, просто создайте ссылку, на которую пользователь может щелкнуть. Или найдите файл загрузки ajax.