ActionFilter Response.StatusCode всегда 200 - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь настроить фильтр действий, который делает что-то, только если StatusCode из HttpContext.Response равно 302.

Я ожидал бы, что смогу сделать это в методе OnActionExecuting, но StatusCode всегда 200.

ActionFilter код:

public class CustomFilter : IActionFilter
{
   public void OnActionExecuting(ActionExecutingContext context)
    {
        // do some setup
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (context.HttpContext.Response.StatusCode == StatusCodes.Status302Found)
        {
            // never get here
        }
    }
}

Мой Action метод:

public IActionResult Redirect()
{
    return RedirectToAction("Index", "Home");
}

И регистрацияActionFilter in startup:

public void ConfigureServices(
    IServiceCollection services)
{
    services.AddMvc(
        options =>
        {
            options.Filters.Add(new CustomFilter());
        });
}

Я проверил в браузере, он правильно возвращает 302 и выполняет перенаправление.Я также пытался использовать интерфейс IAsyncActionFilter, но у меня возникла та же проблема.

Как применить ActionFilter к ( only ) перенаправленному ответу?

И почему это не работает, как есть?

РЕДАКТИРОВАТЬ : Ой, у меня их было наоборот.На самом деле, я все еще получаю эту проблему, хотя ...

Ответы [ 3 ]

0 голосов
/ 09 августа 2018

Вы можете попытаться преобразовать ваш ActionExecutedContext.Result объект в ObjectResult и извлечь из него StatusCode.

public void OnActionExecuted(ActionExecutedContext context) { var statusCode = (context.Result as ObjectResult)?.StatusCode }

0 голосов
/ 15 апреля 2019
int? statusCode = null;
ObjectResult result = context.Result as ObjectResult;
statusCode = result?.StatusCode;

if (statusCode == null)
{
    StatusCodeResult statusResult = context.Result as StatusCodeResult;
    statusCode = statusResult?.StatusCode;
}
0 голосов
/ 22 мая 2018

Вы просматриваете код состояния ответа до того, как ответ будет сгенерирован.OnActionExecuting - это , вызываемый до , когда действие выполняется, поэтому код состояния еще не установлен. Значение по умолчанию для кода состояния - 200, и это то, что вы видите.

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

Update.

Другая проблема может заключаться в том, что в базовой структуре фильтр действий выполняется до и последействие выполнено.Таким образом, ответ еще не обработан, и код состояния не установлен в объекте ответа http.

Правильный метод для вашего варианта использования , по-видимому, IResultFilter.OnResultExecuted

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...