3

在我公司,我们无法为每个新请求实例化控制器。我们必须将它存储在会话中并每次都重新使用它,我知道这是错误的,但我们必须在请求之间保持控制器的状态。所以这就是我们所做的:

我们创建了这个控制器工厂:

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' 参数将具有第一次调用操作的值。我找不到任何可以解释的东西。请求参数字典具有正确的值,但操作仍获取旧值。

4

1 回答 1

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();
        }
    }
}

希望这会有所帮助,

于 2013-03-20T14:01:06.170 回答