2013-04-25 37 views
1

我有它創建了一個文件,並返回一個流內容的ASP.NET Web API的行動:接受並使用了HTTPClient從下載的ASP.NET Web API流內容

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 2013-07-25 20:47:42

+0

@cjohns不,我沒有找到答案。 – Rivka 2013-07-26 07:03:40

回答

3

你有沒有想過只是打電話:

client.GetByteArrayAsync(address) 

,而不是得到字節數組的結果,然後只將其保存到內存流?

編輯::

嘗試這樣:

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

不,我沒有。我只是嘗試用GetByteArrayAsync替換我的GetAsync,但出現語法錯誤。只需運行單行client.GetByteArrayAsync(address);投擲「發生了一個或多個例外」。 – Rivka 2013-04-25 17:27:57

+0

謝謝,但仍然給我「發生了一個或多個錯誤」。另外,我使用的是ASP.NET 4.0(不是4.5)。我也嘗試改變我的操作來返回一個ByteArrayContent,但它沒有任何區別。請注意,當我通過在瀏覽器中調整URL來調用Web API時,不會引發錯誤,並且該文件會下載並顯示在瀏覽器中。只是HttpClient代碼似乎沒有工作。 (我原來的方法沒有發生任何錯誤。) – Rivka 2013-04-25 19:07:26

1

爲什麼你認爲尚未下載發生了什麼?

默認情況下,當您執行GetAsync HTTP客戶端時,將創建MemoryStream作爲緩衝區並顯示結果。 ReadAsStreamAsync只是返回緩衝的StreamContent。

編輯: 您不能在Web瀏覽器中創建這樣一個文件,

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

我不認爲API沒有返回流。我只是簡單地需要用戶來獲取文件...所以我們需要對流進行操作。我不能使用Response.WriteFile或類似的東西,因爲它給了我「在這種情況下,響應不可用」。 – Rivka 2013-04-26 15:20:27

+0

我在這裏失去了一些東西...我得到如何創建該文件...我需要它*下載* ...你是說你實際上不能在相同的請求下載到瀏覽器嗎?希望我的問題清楚。 – Rivka 2013-04-26 18:49:04

+0

@Rivka我很困惑,你說你想用HttpClient。但是現在你說你想使用瀏覽器。我不明白你的情況。 – 2013-04-26 22:24:30

-1

HttpClient的服務器上運行,一邊所以這真的令人困惑你正試圖在這裏實現什麼。如果您真的需要使用HttpClient,您可以將結果流保存到文件流中,就像您可以在註釋中閱讀一樣。

如果您希望在網絡瀏覽器中下載文件,您不需要也不能使用HttpClient。正如你在評論中寫到的,它已經可以工作了,只需創建一個用戶可以點擊的鏈接即可。或者搜索ajax下載文件。