5

これは、IIS6の世界でASP.NET2.0を使用しています。

POSTを介してデータを送信するフォームを送信するユーザーがいます。データを受信するページは、いくつかの簡単な検証を行います。検証に合格すると、基本的にRequest.Form( "NameHere")を使用してデータを読み取るブラックボックスコードルーチンが実行されます。

POSTアイテムの値を変更して、POSTに戻すことができるようにしたいと思います。Request.Form( "NameHere")を読み取るコードを変更する機能がないため、回避策は、ページの読み込みイベント中にデータを変更することです。POSTアイテムの値を変更した場合、ブラックボックスコードを変更する必要はありません。

HTTP POSTのアイテムの値を変更することは可能ですか?

誰かがこれをしましたか?

ありがとう!

4

3 に答える 3

12

少しハッキーですが、POST変数の値を変更する方法があります。

Reflectionを使用して、Request.Formコレクションを非読み取り専用としてマークし、値を必要な値に変更して、再度読み取り専用としてマークし直すことができます(他の人が値を変更できないようにするため)。次の関数を使用します。

protected void SetFormValue(string key, string value)
{
  var collection = HttpContext.Current.Request.Form;

  // Get the "IsReadOnly" protected instance property.
  var propInfo = collection.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

  // Mark the collection as NOT "IsReadOnly"
  propInfo.SetValue(collection, false, new object[] { });

  // Change the value of the key.
  collection[key] = value;

  // Mark the collection back as "IsReadOnly"     
  propInfo.SetValue(collection, true, new object[] { });
}

私は自分のマシンでコードをテストしましたが、正常に動作します。ただし、パフォーマンスや移植性を保証することはできません。

于 2009-08-24T16:13:34.340 に答える
2

現在のPOSTは変更できませんが、新しいPOSTリクエストを作成してそれにリダイレクトすることはできます。

于 2009-08-24T15:45:56.447 に答える
1

元のPOST宛先を自分のものに変更する唯一の方法だと思います。その後、コード内で、自分のアドレスに送信されるすべてのリクエストがブラックボックスアドレスにディスパッチされます。

ただし、これにはいくらかのオーバーヘッドがあります。

私が覚えている限り、フォームコレクションは変更できませんよね?正確な構造は覚えていませんが、

Request.Form("NameHere") = "newValue"

動作しません。

よろしく

于 2009-08-24T15:45:46.273 に答える