4

複数のユーザーに電子メールを送信する Web ページがあります (オンライン配布リスト)。送信ボタンをクリックして電子メールが送信されると、送信された電子メールの数、エラー、およびその他の情報を一覧表示するステータス ページが表示されます。ユーザーが戻るボタンをクリックすると、電子メールが再送信されます。どうすればこれを防ぐことができますか?

注: ブラウザは、実際に電子メールを送信する前に、ページにデータを「再送信」または「再送信」するようにユーザーに促しますが、ユーザーがそれをクリックして、電子メールの 2 つのコピーが送信された理由を疑問に思うのを止めることはできません。

環境:

  • サーバー: C#、ASP.NET 2.0、IIS6
  • クライアント: 任意のブラウザー (SmartNavigation のような IE 固有のソリューションは必要ありません)
4

1 に答える 1

16

コード内で、電子メールが送信された直後に、確認ページへの 302 リダイレクトを実行します。

protected void btnSend_Click(object sender, EventArgs e)
{
    SendManyEmails();
    Response.Redirect("confirmation.aspx");
}

このようなコードでは、元のページへの POST がブラウザの履歴に残りません。

この一般的なパターンは、Post/Redirect/Get パターンとして知られています。

Post/Redirect/Get を実行するときに状態を維持することに関するボーナス情報

このパターンの主な欠点は、ユーザーをリダイレクトするときに POST 要求の処理からのすべての状態が失われることです。したがって、新しい要求コンテキストが開始されます。ASP.NET では、これにはPageとすべてのControlオブジェクト内のメンバー、および に格納されているすべてのものが含まれますViewState

POST リクエストの処理中に、何らかの「ステータス オブジェクト」 (送信されたメール メッセージのログなど) を生成する場合、次の GET リクエストのためにこのオブジェクトを保存する何らかの方法が必要になります。一部の Web フレームワークには、これに特化した機能があります: RoR has flash、ASP.NET MVC has TempData. ASP.NET フォームにはそのような概念が組み込まれていないため、自分で何かを理解する必要があります。

オブジェクトをSessionPOST に保存し、次の GET でそれを読み取って削除することは、これを解決する 1 つの方法です。複数の場所で使用する場合は、これを中心に抽象化を構築できます。また、ASP.NET フォーム用の flash/TempData の既存の実装を Web で検索することもできます。

于 2009-11-24T17:02:01.143 に答える