2

HttpRequestRequest.Form コレクションに値を追加する必要がありますが、指定されたフォーム値でインスタンスを初期化する方法がわかりません。Initializeコントローラーのメソッドをオーバーライドして、HttpRequest次のように初期化しようとしました:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
   var requestField = typeof (HttpRequestWrapper).GetField("_httpRequest", BindingFlags.NonPublic |
                                                                               BindingFlags.Instance);
   var responseField = typeof(HttpResponseWrapper).GetField("_httpResponse", BindingFlags.NonPublic | BindingFlags.Instance);


   var req = (HttpRequest) requestField.GetValue(requestContext.HttpContext.Request);
   var res = (HttpResponse)responseField.GetValue(requestContext.HttpContext.Response);
//**************** HERE I TRY TO INITIZLIZE FORM COLLECTION WITH MY VALUE 'additional_form_value' but nothing  
   var newReq = new HttpRequest(null, req.Url.ToString(), "?additional_form_value=test");
   newReq.RequestType = "POST";
//***************


   var r = new RequestContext(new HttpContextWrapper(new HttpContext(newReq, res)), requestContext.RouteData);


   base.Initialize(r);
}

Request.Formコレクションに新しいアイテムを追加する方法はありますか?

編集:

そのアプローチを試みたとき、例外が発生しました(オブジェクト参照がオブジェクトのインスタンスに設定されていません。):

NameValueCollection oQuery = requestContext.HttpContext.Request.QueryString;
oQuery = (NameValueCollection)requestContext.HttpContext.Request.GetType().GetField("_form", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(requestContext.HttpContext.Request); //exception here
PropertyInfo oReadable = oQuery.GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
oReadable.SetValue(oQuery, false, null);
oQuery["foo"] = "bar";
oReadable.SetValue(oQuery, true, null);
4

1 に答える 1

0

投稿に追加する前にデータを構築します。

次のようなリクエストのストリームにデータを追加する必要があります。

using(HttpWebRequest myHttpRequest = (HttpWebRequest)WebRequest.Create(myUrl)
{
   byte[] bytes = Encoding.UTF8.GetBytes(myFormData);
   Stream requestStream = null;
   try
   {
      myHttpRequest.ContentLength = bytes.Length;
      requestStream = myHttpRequest.GetRequestStream();
      requestStream.Write(bytes, 0, bytes.Length);
   }
}

エンコーディングタイプを変更する必要があるかもしれませんが、質問が完全に間違っていない限り、これが役立つことを願っています.

于 2012-11-20T09:36:44.500 に答える