でコピー/クローンHttpContextのユーザーのウェブリクエスト
-
13-09-2019 - |
質問
何のための最も簡単な方法はクローンの現在の要求のHttpContextインスタンス?
の開発をしているアプリ Asp.net MVC v1.改定PartialView力を実際にサブタイミング制御やセンシング制御法が独自のコンテキストご利用の際はPartialViewsご記入のデータを表示、カスタマーサポート/メインビューのコントローラです。作成した自分の機能で呼び出すことはでき行動をコントローラ内からの眺め。このように取得します:
- んをサブ-ビューのデータが私の主な観光スポットの拠点にコントローラのアクション
- サブコントローラーの方法を操ることができるデータを内封したとは無関係に他のビュー/コントローラ
問題は、それぞれのサブコントローラの要請を使HttpContext.このセットであHttpContext.項目サブコントローラーで実際にpopulates HttpContextの実績。
だからいたいクローンHttpContext.いて:
HttpContext subContext = new HttpContext(request, response);
// what happened to Session, User, Items etc. properties?
ここに設定しない他の要求に応じます。がだらだらとも必要であるその他の特性やコレクション...のようなセッション、ユーザー...など。
解決 2
不可
私は、実際の深いクローン作成が原因で、サーバーのセッション状態では不可能であると思います。クローニングはまた、本質的に静的であり、クローニングすることができないWebサーバの特定の内部リソースである、この値のクローンを作成する必要があります。この場合、Webサーバは、例えば、複数のSessionオブジェクトを持つことになります。
の回避策の
とにかく。この問題を回避するには、サブ制御処理をインスタンス化する前に、追加のコンテキスト値を設定することでした。処理が終了した後、私は元の値を元に戻します。それは前にあったようにだから私は実際にコンテキストを持っています。
他のヒント
が、"できない"の回答が正しくあり、代替多くのリーダー執筆の値を現在のコンテキストを書き換え後の状態にすること。このセクションの新しいHttpContextオブジェクトの全てのURL、希望する
// A new request/response is constructed to using a new URL.
// The new response is using a StreamWriter with null stream as a backing stream
// which doesn't consume resources
using (var nullWriter = new StreamWriter(Stream.Null))
{
var newRequestUri = new Uri("http://www.somewhere.com/some-resource/");
var newRequest = new HttpRequest("", newRequestUri.ToString(), newRequestUri.Query);
var newResponse = new HttpResponse(nullWriter);
var newContext = new HttpContextWrapper(new HttpContext(newRequest, newResponse));
// Work with the new context here before it is disposed...
}
参考: https://github.com/maartenba/MvcSiteMapProvider/issues/278#issuecomment-34905271
ASP.NET MVCフレームワークでは、意図的に仮想のすべてのメンバーと抽象クラスへの依存関係になります。それは単純に言う - 。拡張
コントローラはHttpContextBase、ないのHttpContextに依存しています。おそらく、あなたはあなたがそれをラップすることができますので、あなたのサブコントローラがあまりにもHttpContextBaseに依存することができます。 ちょうど私の2セントます。
私が使用した
<% Html.RenderAction("Action", "Controller"); %>
偉大な効果のために、私は複雑なコードに頼らずに完全に隔離/ escapsulatedアクションを作成することができます。これは、同じ複雑させずに同じ機能を提供するように思われる。
レンダリングされたビューは、他のような標準的な部分図とコントローラのアクションである。