2011-02-01 11 views
2
string filePath = ExportAndSaveInvoiceAsHtml(invoiceId);  

Response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(filePath)); 

Response.WriteFile(filePath); 

// Using Response.End() solves the problem 
// Response.End(); 

私はHTML請求書(請求書のgridViewから)をダウンロードできるようにします。結果のファイルには、請求書ファイルのデータ+不要なページhtmlが含まれています。Response.End()は指定されたシナリオで必須ですか?

私はResponse.End()を使用すると、問題を解決しますが、例外が常にスローされます。いくつかのスレッドで例外が設計通りに読み込まれています。しかし、それは確かです、それはいつも応答の切り捨てのような問題を引き起こすでしょうか?

他にどのようにファイルデータを書き込むことができますか?

Btwは、以前はPDFとして請求書を書いていましたが、Response.End()を使用しないと、不完全なファイルのダウンロードが発生しました。

誰かがカスタムデータ/ファイルをレスポンスストリームに書き込むことの基本を伝えることができます。

答えて

2

これは、応答がであるためです。です。バッファをフラッシュするにはResponse.End()に電話をかけ、ハンドラスレッドが完了する前にクライアントが完全な応答を得られるようにする必要があります。

Response.End()によって投げられたThreadAbortExceptionは、意図的なものであり、安全に無視することができます。

+0

この例外は、私は内部のそれを包ん無視できるので、まあ、私は今、外側のtryブロックを持っており、ダミーtry { Response.End(); } catch(例外ex) { Logger.LogException(ex); } –

+0

しかし、それは外部のcatchブロックにも入ります。このブロックには、ユーザーにエラーメッセージを表示するコードがあります。 –

+0

@Munish、私は理解できません。例外を飲み込むので、外側のスコープに伝播すべきではありません。 (また、 'Exception'型の代わりに' ThreadAbortException'をキャッチする必要があります)。 –

1

代わりのResponse.Endの()あなたはこの方法

HttpContext.Current.ApplicationInstance.CompleteRequest() 

を使用することができます例外をスロー避ける傾向にある:)

+0

コンパイラエラーメッセージが表示されます。CS0103: 'HttpContext'という名前が現在のコンテキストに存在しません。 –

+0

完全なパスを試してください:System.Web.HttpContext .... – Ozzy

+1

"System.Web;を使用していました。あいまいな名前解決の問題があるかもしれません。とにかく、フルパスを使ってコンパイルができました。まだ機能は同じです。まだファイルとページのデータが混在しています。 –

関連する問題