2015-09-01 2 views
3

Я создаю журнал, и мне нужно получить тело запроса для сохранения в db. Я создал фильтр с HttpActionContext. Я попытался восстановить через filterContext.Request.Content.ReadAsStringAsync(). Результат; , но он всегда возвращает мне пустую строку.WebApi получить сообщение raw body внутри фильтра

LogFilter.cs

public override void OnActionExecuting(HttpActionContext filterContext) 
    { 
     try 
     { 
      Task<string> content = filterContext.Request.Content.ReadAsStringAsync(); 
      string body = content.Result; 

      logModel.RequestLog rl = new logModel.RequestLog(); 
      rl.IP = ((HttpContextWrapper)filterContext.Request.Properties["MS_HttpContext"]).Request.UserHostAddress; 
      rl.Type = filterContext.ControllerContext.RouteData.Values["controller"].ToString().ToUpper(); 
      rl.URL = filterContext.Request.RequestUri.OriginalString; 
      rl.Operation = filterContext.Request.Method.Method; 
      rl.RequestDate = DateTime.Now; 


      filterContext.ControllerContext.RouteData.Values.Add("reqID", new deviceLog.RequestLog().Add(rl).ID.ToString()); 
     } 
     catch { } 
     //return new deviceLog.RequestLog().Add(rl); 
     base.OnActionExecuting(filterContext); 
    } 
+0

Вы сохраняете необработанный запрос внутри своей базы данных? Звучит как сомнительный выбор дизайна. –

+0

Я сохраняю тело запроса, чтобы отслеживать некоторые ошибки. –

+0

Как вы используете этот фильтр? Присвоить его методу действия? –

ответ

12

Может запросить поток уже достиг к концу. Попробуйте сбросить позицию потока до начала:

public class MyAttribute:ActionFilterAttribute 
{ 
    public override void OnActionExecuted(HttpActionContext actionContext) 
    { 
     string rawRequest; 
     using (var stream = new StreamReader(actionContext.Request.Content.ReadAsStreamAsync().Result)) 
     { 
      stream.BaseStream.Position = 0; 
      rawRequest = stream.ReadToEnd(); 
     } 
    } 
} 
+0

Я думал, что ваше приложение MVC. См. Мое обновленное сообщение для WebAPI. –

+0

Как ваш ответ соответствует официальной документации Microsoft. «Причина этого правила заключается в том, что тело запроса может храниться в небуферизованном потоке, который может быть прочитан только один раз». https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api#using-frombody Is он гарантировал, что тело всегда будет читать? – Pawel

Смежные вопросы