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

Какой тип «ответа»? – 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); 

Response является Controller свойство, так что вам не нужно создавать какие-либо HttpResponseMessage объект.

+0

Не знаете, почему это было отклонено? Это решило мою проблему, хотя я немного изменил преобразование в байты, так как ваша версия дала мне правильное количество байтов, но это дало мне огромный список NULL. Я использовал: byte [] bytes = memStream.ToArray(); то остальная часть вашего кода прекрасно работает благодаря большому количеству :) –

+0

Добро пожаловать! :) – erikscandola

0

Существует много способов решить эту проблему, но я покажу вам свое. Вместо HttpResponseMessage вы можете просто сделать FileStreamResult. И вам не нужно создавать экземпляр HttpResponseMessage, который уже является частью метода контроллера. Вот как я попытаюсь исправить ваш код. Не забудьте использовать FileStreamResult.

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

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

_ «Следите за последней строкой, ее непроверенной» _ - да, вы не можете вернуть двоичный файл Excel как строку ASCII, подобную этой. – CodeCaster

+0

как бы вы преобразовали memStream в строку? – montewhizdoh

+0

Неправильный вопрос. Вопрос в том, «почему». Это двоичный файл, поэтому вы должны служить ему двоичным. Непонятно, почему вы считаете, что обслуживание этой строки приведет к решению этой проблемы. – CodeCaster