2016-05-06 88 views
0

我曾經在一個控制器下面的代碼返回流是一個Excel文件來下載客戶端:控制器歸國HttpResponseMessage不設置內容類型正確

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); 
MemoryStream memStream = ReportExporter.ExportReport(analystReport); 

response.Content = new StreamContent(memStream); 
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
response.Content.Headers.ContentDisposition.FileName = saveAsFileName; 

return response; 

當我做客戶端的請求一邊它只是讓我回來的響應消息的包裝:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: 
{ 
    Content-Type: application/octet-stream 
    Content-Disposition: attachment; filename=.xlsx 
} 

我相信這可能是由於回來的文字,因爲這頭是我在Chrome中看到:

Content-Type:text/html; charset=utf-8 

我無法弄清楚這裏發生了什麼,嘗試了各種各樣的事情。

+0

什麼是'response'類型? – erikscandola

+0

對不起還有一段代碼加了回來,它是一個HttpResponseMessage –

+1

你通常也應該包含控制器方法聲明。它確定/指示您的代碼所需的接口。 – montewhizdoh

回答

0

嘗試這種解決方案:

// Copy file to byte array 
byte[] file = new byte[memStream.Length]; 
memStream.Read(file, 0, file.Length); 

// Send file 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("content-disposition", "inline;filename=" + saveAsFileName); 
Response.Buffer = true; 
Response.Clear(); 
Response.BinaryWrite(file); 
Response.End(); 

// Return success 
return new HttpStatusCodeResult(HttpStatusCode.OK); 

ResponseController屬性,因此您無需創建任何HttpResponseMessage對象。

+0

不知道爲什麼這被拒絕? 這解決了我的問題,謝謝,雖然我稍微改變了轉換爲字節位,因爲你的版本給了我正確的字節數,但它給了我一大堆NULL。我使用:byte [] bytes = memStream.ToArray();那麼你的代碼的其餘部分完美的工作非常感謝:) –

+0

不客氣! :) – erikscandola

0

有很多方法可以解決這個問題,但我會告訴你我的。您可以使用FileStreamResult來代替HttpResponseMessage。你不需要實例化HttpResponseMessage,它已經是控制器方法的一部分。這就是我將如何開始嘗試修復你的代碼。請記住改用FileStreamResult。

public FileStreamResult DownloadExcel(???analystReport????) 
    { 
     MemoryStream memStream = ReportExporter.ExportReport(analystReport); 

     return new FileStreamResult(memStream , "application/vnd.ms-excel", saveAsFileName); 
    } 
+0

_「注意最後一行,它的未經測試」_ - 是的,你不能像這樣的ASCII字符串返回一個二進制Excel文件。 – CodeCaster

+0

如何將memStream轉換爲字符串? – montewhizdoh

+0

錯誤的問題。問題是「爲什麼」。這是一個二進制文件,所以你應該把它作爲二進制文件。目前還不清楚爲什麼你認爲服務它可以解決問題。 – CodeCaster