2016-05-06 53 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