c # dot net core action filter - Как прочитать ответ - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть фильтр действий с методом:

public void OnActionExecuted(ActionExecutedContext context)
    {
        try
        {
            Stream originalBody = context.HttpContext.Response.Body;
            string responseBody = string.Empty;

            try
            {
                using (var memStream = new MemoryStream())
                {
                    context.HttpContext.Response.Body = memStream;

                    memStream.Position = 0;
                    responseBody = new StreamReader(memStream).ReadToEnd();

                    memStream.Position = 0;

                    memStream.CopyTo(originalBody);
                }

            }
            finally
            {
                context.HttpContext.Response.Body = originalBody;
            }

            _logger.LogDebug("OnActionExecuted, response=" + responseBody);

        }
        catch(Exception ex)
        {
            _logger.LogError(ex, "");
            //throw ex;
        }
        //throw new NotImplementedException();
    }

Переменная responseBody всегда является пустой строкой. Но я получаю ниже ответ на Почтальон:

{"custId": "1235","Channel": "InternetBanking"}

Почему я не могу получить это в моей переменной responseBody?

1 Ответ

0 голосов
/ 18 ноября 2018

Ваша проблема в том, что вы создаете поток памяти, назначаете его на Response.Body, но никогда не заполняете его:

using (var memStream = new MemoryStream())
{
    context.HttpContext.Response.Body = memStream;

    memStream.Position = 0;
    responseBody = new StreamReader(memStream).ReadToEnd();

    ...
}

В этом коде memStream это просто пустой поток, поэтому, когда вы читаете его, он ничего не читает.

Если вы пытаетесь получить доступ к результату метода контроллера, вы можете получить его через свойство context.Result.

Или вы просто пытаетесь записать тело ответа перед возвратом звонящего? Фильтры не являются подходящим местом для этого - они больше связаны с параметрами вашего метода контроллера и возвращаемыми объектами. Конвейер MVC не заполнил Response.Body, поэтому вы не можете получить к нему доступ - это делается промежуточным ПО MVC.

Вам нужно создать свое собственное промежуточное программное обеспечение для перехвата вызова, когда заполнен объект Response, и вы можете записать это в журнал. Есть множество сайтов, которые могут показать вам, как это сделать. Одним из примеров является здесь

...