在我的公司,我们无法为每个新请求实例化一个控制器。我们必须将它存储在会话中并且每次都重新使用它,我知道这是错误的,但我们必须在请求之间保持控制器的状态。所以这就是我们所做的:
我们创建了这个控制器工厂:
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'参数将具有第一次调用该操作的值。我找不到任何可以解释这一点的东西。请求参数字典具有正确的值,但操作仍然获得旧值。
答案 0 :(得分:2)
您可以尝试通过重写Initialize方法重新启动ValueProvider和TempData,以便处理新值。
public class SGVController : Controller
{
protected override void Initialize(RequestContext requestContext)
{
this.TempData = null;
this.ValueProvider = null;
base.Initialize(requestContext);
}
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();
}
}
}
希望这会有所帮助,