2009-06-30 7 views
3

は、私は次の操作を行う方法を把握しようとしています:フォームが送信された後ASP。ネットMVC保存し、再生後のデータ

1)、生のPOSTデータをシリアル化し、それをデータベースに保存する

2)データベースから投稿データを読み込み、同じURLに再度投稿して再生してください。

私の最終目標を説明するために、私たちはdev、acceptance、productionという3つの主要なenvを持っています。私はdevの変更を行い、同じ変更を行うことでその変更を承認に促進できるようにしたいと考えています。

誰もが考えている?

おかげで、 ポール

+0

これらの環境をもう少し説明できますか?彼らは具体的に開発のためであるか、またはステージング環境(「受け入れ」)がコンテンツの編集/承認段階として使用されていますか?これが当てはまる場合は、単一のdbを使用し、レコードを公開するかどうかを示すフラグをレコードに設定する必要があります。 – Soviut

+0

私たちの環境には、データベースとドメイン間のアクセス権が別々になっています。私は実際には、特定の環境に投稿されたときに他のアクション(さまざまなアプリケーションの再起動やリフレッシュ)を引き起こす内部設定項目を宣伝することも検討しています。 –

+0

私は似たようなものを探していますサンプルはありますか? –

答えて

4

私はロギング目的で一度似たようなことをしました。私はGETとPOSTの両方のリクエストをログに記録しました。私たちのテストグループによって記録されたエラーを追跡するため、そしてライブアプリケーションによって、それらを複製することができました。

ここで最も大きなトリックは、ウェブアプリケーションが大部分はステートレスである必要があることです。 Sessoinでアプリケーションの周りに情報を渡すか、アプリケーションでViewStateをまったく使用すると、さらにいくつかのバンプが発生する可能性があります。

ウェブサイトをRESTfulに作成したことがあっても、これはあまり難しくありません。そして、RESTful(http://en.wikipedia.org/wiki/Restful)では、与えられたRESTfulな要求は、サーバーに対して行われた以前の要求について何も仮定していないという事実を参照しています - それ自体は原子であり、実行しようとしているアクションを実行するために必要なすべての情報を含みます。

私は、次の手順を実行して、これを達成:

1)私は私が監視したいアクションにActionFiltersを作成しました。これらのActionFiltersは、POSTデータの取得を実行し、それをデータベースに保存しました。これは、コード内で侵襲性が低く、関心のあるすべてのアクションに簡単に追加/削除できるため、うまくいきました。2)ActionFilterは基本的にリクエストタイプ(GET vs. POST、HttpContext.Current経由)を記録しました。 .Request.HttpMethod(正しくリコールした場合)とリクエストが却下したURL。 POSTの場合、フォームデータ(HttpContext.Current.Request.Form)をJSONにシリアル化しました。私はJSONを人間が読めるようにしました(これは私の目的である問題の診断を助けるために重要です)。そして、FORMデータを使って作業しているので、フラットなJSON構造に簡単にシリアライズするのに十分です。あなたのニーズに応じて余分になるかもしれませんが、私は情報目的のために他のリクエスト変数もすべて(HttpContext.Current.Request.Headers)ログに記録していると思います。

私はSystem.Web.Script.Serialization.JavaScriptSerializerを使用してフォームデータをシリアル化しました。

このすべてのデータは、私は、具体的に鑑賞するために設計された新しいMVCコントローラを作成し、再起動データベース(要求タイプ、URL、シリアル化された投稿データ、タイムスタンプ、現在のユーザ、等)

3)に格納されました要求。私の場合は、監視の要求を記録していたので、LoggingControllerでした。私の主なビューは、すべてのリクエストとターゲットURLのリストでした。私が掘り下げて特定のエントリの「表示」/「表示」を行った場合、記録されたすべての詳細が表示されます。

アクションの実際の複製は、JSONデータをデシリアライズして、「ビュー」ページにデシリアライズされたデータが挿入された(私の場合は隠れた)フォームフィールドを構築することによって作成されました。その後、GETの場合はGreen、POSTの場合は赤のボタンを追加しました。ボタンをクリックするとアクションが複製されます.GETは簡単ですが、ターゲットページにユーザーを送信するだけです。

しかし、POSTの場合、ユーザーに「POSTリクエストを複製しようとしていますが、呼び出されたアクション(削除、更新など)によってサーバー上のデータが変更される可能性があります。 "

「はい」をクリックすると、JavaScriptを使用してフォームを送信し、POSTアクションとなり、重複アクションが発生します。

あなたの環境のデータをロギングし、そのデータを他の環境データベースにコピーして、私の "LoggingController"に相当するものをロードして、必要なアクション複製する。

そして明らかに、あなたはこれを望み通りにとることができます。いくつかの単体テストなどを駆動するためにあなたの "記録された"データを使うことができます。

+0

すばらしい詳細をありがとうございます。非常に感謝しています。 –

+0

これはまさにアプリの問題を診断し、修正を確認するためにやりたいことです。ウェイバックマシンと再生履歴を巻き戻します。このポストはもうちょっと古くなっています...最近これが役に立つと思っていますか?ありがとう! –

+0

セキュリティ監査(いつ誰が何をしたか)にも役立ちます。 –

1

は、これは実際に別の環境からデータを移動する回り道です。ある環境から別の環境にデータを移動するには、XML、JSON、またはSQL問合せの形式でフィクスチャを使用する必要があります。このプロセスは、いくつかの簡単なスクリプトを使用してさらに自動化することができます。

このような場合は、適切なデータベースの複製を調べる必要があります。

にもかかわらず、このフォームを使用するのは本当にばかげたやり方です。すべてバックエンドで行い、データベース同士を直接話すようにしてください。

+0

私は彼が、他の環境で開発したのと同じ投稿を使って、データを移動するのではなく、テストすることを望んでいると言います。私はこれを間違って読んでいるかもしれませんが。 – JoshBerke

+0

なぜ彼はプロダクション環境で「テスト」していますか?これは、開発環境とステージング環境が特別に設計されたものです。彼は、彼が別の環境への変更を "促進"しようとしていると言いました。 – Soviut

+0

私はあなたが十分に具体的ではない方法で質問を読むことができることを知っています。彼が実際に自分のプロダクション環境に変更を加えているのであれば、私はこれをやってはいけません。 – JoshBerke

0

まず、リクエストを取得することです。これを行うには、新しいhttpモジュールを作成します。このhttpモジュールは、configファイルでオンまたはオフにすることができます。

メッセージ(BeginRequestイベントでメイビー)を保存したいのですが、あなたは以下を記録したいと思うのリクエストライフサイクルの場所を探す:

  • Request.InputStream
  • のURL
  • ユーザー情報は、あなたが、あなたは単にBIを再投稿できるようになる方法を見つけるために、データをポストする準備ができたいと思うとき、フリップ側では

(あなたは、認証に対処しようとしている場合) Request.InputStreamから取得したデータです。私の頭の上から離れて、これで助けになるクラスが.netにあるかどうかはわかりません。しかし、Webクライアントの1つは、要求の本文全体を指定できるメソッドを持つかもしれません。

0

私はこのように完全に自動化できるアプリケーションはほとんどありません。

あなたは、レコードをサポートするボックス製品のうちでそれを試してみてのように再生することができます:

JMeterは、セレン、IOpusまたはある程度フィドラーへ。 IOpusは最も簡単に始めることができます。

これはすぐにわかりますし、あなた自身の記録/再生ソリューションを実装する手間を省くことができます。

関連する問題