在我公司,我们无法为每个新请求实例化控制器。我们必须将它存储在会话中并每次都重新使用它,我知道这是错误的,但我们必须在请求之间保持控制器的状态。所以这就是我们所做的:
我们创建了这个控制器工厂:
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' 参数将具有第一次调用操作的值。我找不到任何可以解释的东西。请求参数字典具有正确的值,但操作仍获取旧值。