2015-02-09 203 views
2

當我在API的方法返回一個HttpResponseMessage:下載文件提示符下使用的WebAPI HttpResponseMessage

[HttpGet, HoodPeekAuthFilter] 
    public HttpResponseMessage GlobalOverview() 
    { 
     try 
     { 
      StatsRepo _statsRepo = new StatsRepo(); 

      string file = _statsRepo.IncidentData().AsCSVString(); 

      if (file == null) 
      { 
       return Request.CreateResponse(HttpStatusCode.NoContent); 
      } 

      HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
      result.Content = new StringContent(file); 
      result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
      result.Content.Headers.ContentDisposition.FileName = "GlobalOverview.csv"; 

      return result; 
     } 
     catch (Exception ex) 
     { 
      return Request.CreateResponse(HttpStatusCode.InternalServerError); 
     } 
    } 

在我的MVC的Web Apllication我有需要調用API,並返回該文件的控制器操作:

[Authorize] 
    [HttpGet] 
    public HttpResponseMessage GlobalOverview() 
    { 
     HttpResponseMessage file = new HttpResponseMessage(); 
     using (HttpClient httpClient = new HttpClient()) 
     { 
      httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(this.UserName + ':' + this.Password))); 
      Task<HttpResponseMessage> response = httpClient.GetAsync("api.someDomain/Reporting/GlobalOverview"); 
      file = response.Result; 
     } 

     return file; 
    } 

如果我直接訪問API鏈接它會提示我輸入用戶名和密碼,然後保存文件出現的對話,我可以下載該文件。

如果我瀏覽到行動在我的Web應用程序,然後我得到以下響應輸出到屏幕:

StatusCode: 200, 
ReasonPhrase: 'OK', 
Version: 1.1, 
Content: System.Net.Http.StreamContent, 
Headers: { Pragma: no-cache X-SourceFiles: = XXXXXXX 
Content-Disposition: attachment; 
filename=GlobalOverview.csv 
Content-Type: application/octet-stream Expires: -1 

我需要它,我需要返回FileResult,但我不知道是怎麼將HttpResponseMessage轉換爲FileResult。

回答

8

在您的MVC控制器中,您可以嘗試返回一個FileResult,並使用File()方法讀取您的API的響應作爲字節數組。

[Authorize] 
[HttpGet] 
public FileResult GlobalOverview() 
{ 
    HttpResponseMessage file = new HttpResponseMessage(); 
    using (HttpClient httpClient = new HttpClient()) 
    { 
     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(this.UserName + ':' + this.Password))); 
     Task<HttpResponseMessage> response = httpClient.GetAsync("api.someDomain/Reporting/GlobalOverview"); 
     file = response.Result; 
    } 

    return File(file.Content.ReadAsByteArrayAsync().Result, "application/octet-stream", "GlobalOverview.csv"); 
}