2016-05-06 2 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); 

ResponseControllerプロパティですので、あなたはどんなHttpResponseMessageオブジェクトを作成する必要はありません。

+0

なぜこれが投票されたかわからないのですか? これは私の問題を解決しましたが、私はバイトのビット数を少し変えましたが、バージョンによって適切なバイト数が与えられましたが、それは私に大きなNULLのリストを与えました。私は使用しました:byte [] bytes = memStream.ToArray();あなたのコードの残りの部分はとても感謝しています:) –

+0

あなたは大歓迎です! :) – erikscandola

0

これを解決する方法はたくさんありますが、私はあなたに私を示します。 HttpResponseMessageの代わりに、FileStreamResultを実行するだけで済みます。そして、HttpResponseMessageをインスタンス化する必要はありません.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

関連する問題