8

我遇到了未正确重定向的 ActionFilterAttriute 问题。我不熟悉完整的代码库,但我已经看到了足够多的东西,无法理解发生了什么。

为了简化代码,我删除了不相关的部分:

public class ResolveApplicationRedirectAttribute : ActionFilterAttribute
{
    //some variables
    private ActionExecutingContext _filterContext;

    protected string ApplicationRedirectUrl
    {
        get { return ConfigurationManager.AppSettings["ApplicationRedirectUrl"]; }
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _filterContext = filterContext;

        //a lot of logic that decide if we should redirect or not

        //I added this after the other logic to make it always redirect regardless of what happens inside the logic above
        _filterContext.Result = new RedirectResult(ApplicationRedirectResult);
    }
}

[ResolveApplicationRedirect]
public ActionResult Index(CrmQueryStringParameters crmParameters){
  //some logic
}

这通常是可行的,但是当应用程序在短时间内被几个请求击中时,Index 方法最终被调用,并且因为 View 丢失了一些数据而崩溃(我们知道它丢失了数据。这就是为什么我们想要重定向)。

但是现在当我添加_filterContext.Result = new RedirectResult(ApplicationRedirectResult)作为方法的最后一行时OnActionExecuting,它怎么可能仍然调用我的 Action 方法?

是否有任何已知的错误/角落案例/其他任何可能导致 MVC 忽略RedirectResult我已经放入filterContext并触发操作方法的东西?

即使我将 filterContext.Result 设置为最后一行,任何可能在 OnActionExecuting 的逻辑中都可能导致问题的特殊内容。属性内的任何异常都应该将其炸毁,而不是跳过属性并调用 Action 方法。

任何帮助我指出正确方向的帮助都将在此不胜感激。

4

2 回答 2

0

为 Wouter 的结果 +1。鉴于您显示的代码,应该不可能实现您描述的结果。也许// magic logic here返回 null _filterContext.Result

于 2013-08-26T04:46:35.047 回答
0

我终于找到了问题所在。它与使用_filterContext类变量有关。

问题是 MVC不会为每个请求创建一个新的过滤器实例,导致多个请求共享同一个属性实例。

有关更多详细信息,请参阅MVC3 发行说明中的​​重大更改列表。

于 2013-08-26T08:30:41.503 回答