ここ私の会社では、新しいリクエストごとにコントローラーをインスタンス化することはできません。セッションに保存して毎回再利用する必要があります。これが間違っていることはわかっていますが、リクエスト間でコントローラーの状態を維持する必要があります。そこで、次のことを行いました。
このコントローラ ファクトリを作成しました。
public class SGVControllerFactory : IControllerFactory
{
public IController CreateController(RequestContext requestContext, string controllerName)
{
string _SessionId = controllerName + "Controller";
foreach (var _Object in HttpContext.Current.Session)
{
if (_Object.ToString() == _SessionId)
{
IController _Controller = (IController)HttpContext.Current.Session[_Object.ToString()];
return _Controller;
}
}
return null;
}
public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
{
return SessionStateBehavior.Default;
}
public void ReleaseController(IController controller)
{
//We never release our controllers!!!
}
}
そして、このベースコントローラーがあります:
public class SGVController : Controller
{
protected override void Execute(RequestContext requestContext)
{
if (requestContext == null)
{
throw new ArgumentNullException("requestContext");
}
if (requestContext.HttpContext == null)
{
throw new ArgumentException("Http context is null", "requestContext");
}
Initialize(requestContext);
using (ScopeStorage.CreateTransientScope())
{
ExecuteCore();
Dispose();
}
}
}
このコントローラー クラスがデフォルトの MVC コントローラーと異なる唯一の点は、一度だけ呼び出されるように制限されていないことです。
さて、私の問題は..このアクションがある場合:
public JsonResult Foo(string Bar) {
return Json(new List<string> { Bar, Bar });
}
「Bar」パラメーターには、アクションへの最初の呼び出しの値が含まれます。それを説明するものは何も見つかりません。リクエスト パラメータ ディクショナリには正しい値がありますが、アクションはまだ古い値を取得します。