ここでトランザクションに自分自身を登録するリソースを作成しようとすることは確かにできますが(ISinglePhaseNotification
インターフェイスとクラスのEnlistVolatile
メソッドを参照してください)、技術的に不可能であるため、やりたいことに対する適切なアプローチではありません。Transaction
ASP.NET でバッファリングが有効になっているかどうかに応じて、応答にバイトを書き出すと、それらのバイトはクライアントに送信されます。HTTP プロトコルにはそれを示すメカニズムがないため、バイトを返すことはできません。クライアントは、以前に送信されたバイトを破棄する必要があります。(注: Web サービスはトランザクションをサポートしますが、これは Web サービスではないため、アプローチは異なります)。
とはいえ、サーバー側でトランザクションを作成し、Excel ファイル ハンドルを作成する別のオブジェクトをトランザクションに参加させることもできますが、それもやり過ぎです。送信する応答がExcelシートのみ。他に調整するものはありませんので、取引は必要ありません (他に指定がない限り)。
そのことを念頭に置いて、Excel ファイルを作成するメソッドを簡単に作成して、メモリ/MemoryStream
インスタンス内のバイト配列またはファイル システムに書き込み、その後、成功したかどうかに基づいて、ストリームの書き込みまたは応答の失敗を行うことができます。他の方法で。
確かに、シートを中間媒体に書き込んでいるため、ここではパフォーマンスのトレードオフがあります (メモリはファイル システムよりも高速ですが、シートの大きさと書き込むシートの数を考慮する必要があります)。それから応答に移りますが、それはあなたがしなければならないトレードオフです (トランザクションでこれを行ったかどうかに関係なく)。
ここでのトランザクションは過剰であり、設計上の選択が間違っています。