エラー:
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx");
Response.BinaryWrite(stream.ToArray());
// myMemoryStream.WriteTo(Response.OutputStream); //works too
Response.Flush();
Response.Close();
Response.End();
が、これは私が次のエラーメッセージを取得していますよう正しいアプローチであるかを知りたいと思った:私は後ろの私のWebフォームのコードで同じことをやろうとしていますResponse.End();
を呼び出したときにスローされるThreadAbortException
によって引き起こされます。このquestionをチェックしてください。
Response.End();
コールがあることに基づいて、あなたが含むコードがASPX
ページのイベントで実行されていることを前提としています。正しい?
もしそうなら、ファイルをロードしてASPX
ページからGeneric handler
にクライアントに返すコードを移動することをお勧めします。ジェネリックハンドラは、ファイル拡張子がASHX
です。それは非常に簡単です - それはあなたが実装する必要があるメソッドとプロパティを1つだけ持っています。主なものはProcessRequest
メソッドです。ハンドラからのサンプルがServeFile.ashx
と呼ばれる:
public class ServeFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
byte[] fileBytes = File.ReadAllBytes("c:\\path\\to\\folder\\with\\files\\" + context.Request.QueryString["fileName"]);
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
context.Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx");
context.Response.BinaryWrite(fileBytes);
}
public bool IsReusable
{
get
{
return false;
}
}
}
ハンドラを作成した後、あなたはその後、ハンドラが正しいをロードして提供するために使用するQueryString
での適切な識別子とハンドラへのリンクを表示するために、あなたのaspxページを変更することができますファイル。サンプルでは、ファイルはファイルシステムから読み込まれますが、もちろんdbからロードすることも、他の方法で取得することもできます。
これはわかりました。このエラーはどこにありますか?正確にどの行ですか? – HaukurHaf
実行直後。 voidを返すメソッドにコードがあります。これらの2つの同一のコード(MVCとWebフォームのコードは同じですか?) –
全く同じコードではありませんが、結果は同じでなければなりません。ヘッダーをいくつか設定し、バイナリデータをブラウザに出力します。このエラーメッセージはわかりません。私はどの表現が評価されているのか分からない。 – HaukurHaf