Øyv*_*hen 8 .net asp.net-mvc actionfilterattribute asp.net-mvc-4
我有一个没有正确重定向的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
}
Run Code Online (Sandbox Code Playgroud)
这通常有效,但是当应用程序在短时间内受到一些请求的影响时,Index方法最终被调用,并且由于View缺少某些数据而爆炸(我们知道它缺少数据.这就是为什么我们想重定向).
但是现在当我添加了_filterContext.Result = new RedirectResult(ApplicationRedirectResult)
作为方法的最后一行时OnActionExecuting
,它怎么可能仍然调用我的Action方法?
是否有任何知道错误/角落案例/其他任何可能导致MVC无视RedirectResult
我已投入filterContext
并激活行动方法的事情?
即使我将filterContext.Result设置为最后一行,OnActionExecuting逻辑中可能导致问题的任何特殊内容.属性中的任何异常都应该将其炸毁,而不是跳过属性并调用Action方法.
任何有助于指出我正确方向的帮助都将在这里受到赞赏.
我终于发现问题了。这与使用类变量有关_filterContext
。
问题在于,MVC不会为每个请求创建新的过滤器实例,从而导致多个请求共享同一属性实例。
有关更多详细信息,请参阅MVC3 发行说明中的重大更改列表。