ActionFilterAttribute не перенаправляет

У меня проблема с 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, который перестает работать, потому что в представлении отсутствуют некоторые данные (мы знаем, что в нем отсутствуют данные. Вот почему мы хотите перенаправить).

Но теперь, когда я добавил _filterContext.Result = new RedirectResult(ApplicationRedirectResult) в качестве последней строки метода OnActionExecuting, как это возможно, что он все еще вызывает мой метод Action?

Есть ли какие-либо известные ошибки/краеугольные случаи/что-либо еще, что может заставить MVC игнорировать RedirectResult, который я поместил в filterContext, и все равно запустить метод действия?

Что-нибудь особенное, что может быть внутри логики OnActionExecuting, что может вызвать проблемы, даже если я установлю filterContext.Result в качестве последней строки. Любые исключения внутри атрибута должны просто взрывать его, а не пропускать атрибут и вызывать метод Action.

Любая помощь, чтобы указать мне в правильном направлении, будет оценена здесь.


person Øyvind Bråthen    schedule 23.08.2013    source источник
comment
Если вы посмотрите на исходный код MVC, вы увидите метод InvokeActionMethodFilter, который выполняет OnActionExecuting в вашем фильтре, передавая ActionExecutingContext. Если он возвращается с ненулевым значением Result, он возвращает ActionExecutedContext, пропуская вызов вашего действия. Таким образом, то, что вы видите, не должно быть возможным. Таким образом, единственной проблемой может быть нулевое значение для Result. Если вы прокомментируете всю свою логику и оставите только последнюю строку, тогда ваш редирект будет работать?   -  person Wouter de Kort♦    schedule 23.08.2013


Ответы (2)


+1 за результат Воутера. Учитывая код, который вы показали, невозможно достичь описанных вами результатов. Возможно, // magic logic here возвращает null _filterContext.Result?

person robrich    schedule 26.08.2013

Я нашел проблему наконец. Это было связано с использованием переменной класса _filterContext.

Проблема в том, что MVC не создает новый экземпляр фильтра для каждого запроса, в результате чего несколько запросов используют один и тот же экземпляр атрибута.

Дополнительные сведения см. в списке критических изменений в примечаниях к выпуску MVC3.

person Øyvind Bråthen    schedule 26.08.2013