1

さて、.NET Framework には、TransactionScopeデータベースなどのトランザクションへの参加を支援する が含まれています。ただし、オブジェクト モデルに似たものを見つけることができないようです。

ASP.NET Web フォーム アプリケーションがあり、作成したExport to Excelリンクをユーザーがクリックすると、Excel ファイルのオブジェクトに追加されます。これにはもちろん、ヘッダーやExcel ファイルの書き込みなど、多くの変更が必要です。ResponseHttpContextbyte[]

ただし、それが失敗した場合、部分的に発行された応答が返され、単に壊れています。

オブジェクト モデル トランザクションに参加できるテクノロジはありますか?

4

1 に答える 1

2

ここでトランザクションに自分自身を登録するリソースを作成しようとすることは確かにできますが(ISinglePhaseNotificationインターフェイスクラスのEnlistVolatileメソッドを参照してください)、技術的に不可能であるため、やりたいことに対する適切なアプローチではありません。Transaction

ASP.NET でバッファリングが有効になっているかどうかに応じて、応答にバイトを書き出すと、それらのバイトはクライアントに送信されます。HTTP プロトコルにはそれを示すメカニズムがないため、バイトを返すことはできません。クライアントは、以前に送信されたバイトを破棄する必要があります。(注: Web サービストランザクションをサポートしますが、これは Web サービスではないため、アプローチは異なります)。

とはいえ、サーバー側でトランザクションを作成し、Excel ファイル ハンドルを作成する別のオブジェクトをトランザクションに参加させることもできますが、それもやり過ぎです。送信する応答Excelシートのみ。他に調整するものはありませんので、取引は必要ありません (他に指定がない限り)。

そのことを念頭に置いて、Excel ファイルを作成するメソッドを簡単に作成して、メモリ/MemoryStreamインスタンス内のバイト配列またはファイル システムに書き込み、その後、成功したかどうかに基づいて、ストリームの書き込みまたは応答の失敗を行うことができます。他の方法で。

確かに、シートを中間媒体に書き込んでいるため、ここではパフォーマンスのトレードオフがあります (メモリはファイル システムよりも高速ですが、シートの大きさと書き込むシートの数を考慮する必要があります)。それから応答に移りますが、それはあなたがしなければならないトレードオフです (トランザクションでこれを行ったかどうかに関係なく)。

ここでのトランザクションは過剰であり、設計上の選択が間違っています。

于 2012-11-14T17:15:54.273 に答える