Internal server error после установки ActionFilter

209
22 октября 2018, 22:10

Пишу фильтр-логгер запросов. MVC WebAPI+NInject.

Класс фильтра:

public class LogFilter : IActionFilter
{
    private LogInfo Info { get; set; } = new LogInfo();
    public LogFilter(IMobileDal dal)
    {
        Dal = dal;
    }
    private IMobileDal Dal { get; }
    public bool AllowMultiple { get; } = true;
    public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    {
        Info.Action = actionContext.Request.Method.Method;
        Info.Url = actionContext.Request.RequestUri.ToString();
        Info.DateBegin = DateTime.Now;
        using (var sr = new StreamReader(actionContext.Request.Content.ReadAsStreamAsync().Result))
        {
            sr.BaseStream.Position = 0;
            Info.Request = sr.ReadToEnd();
        }
        var result = await continuation();
        Info.DateEnd = DateTime.Now;
        using (var sr = new StreamReader(result.Content.ReadAsStreamAsync().Result))
        {
            sr.BaseStream.Position = 0;
            Info.Response = sr.ReadToEnd();
        }
        Info.Status = (int)result.StatusCode;
        Dal.AddLogRecord(Info);
        return result;
    }
}

Привязка в NInject:

    this.BindHttpFilter<LogFilter>(FilterScope.Action)
        .WithConstructorArgument("dal", context => context.Kernel.Get<IMobileDal>());

Запросы отрабатывают, записи сваливаются в базу, я вижу ожидаемый результат - но на выходе получаю 500 Internal server error. При том, что в result - вполне себе 200.

Что может быть не так?

Answer 1

By design the body content in ASP.NET Web API is treated as forward-only stream that can be read only once.

https://stackoverflow.com/questions/12494067/read-httpcontent-in-webapi-controller/12494758#12494758

И после того, как я прочитал результат - клиент его получить уже не смог.

READ ALSO
C# Windows 10 DateTime.Now.ToString(&ldquo;yyyy.MM.dd HH:mm&rdquo;); не ставит точек

C# Windows 10 DateTime.Now.ToString(“yyyy.MM.dd HH:mm”); не ставит точек

В программе работающей под Windows 10 нажав на кнопку в которой прописано:

165
Считывать нажатия кнопок в WinForms

Считывать нажатия кнопок в WinForms

В приложении важны доли секунды для точных вычисленийМожно ли после введенного значения в TextBox нажав кнопку Enter выполнялся какой либо блок...

191
Как правильно распарсить html код?

Как правильно распарсить html код?

Есть html код, использую CsQuery, собственно как правильно вытащить селекторы из этого кодаИнтересует, как мне выдрать Менеджер по грузоперевозкам...

180