У меня есть атрибут Log, который пытается записывать содержимое запроса и ответа в текстовый файл. Я поставил над своим контроллером все действия. В LogAttribute я читаю содержимое как строку (ReadAsStringAsync), поэтому я не теряю тело запроса.Web Api Request Содержимое пусто в действии фильтра
public class LogAttribute : ActionFilterAttribute
{
// ..
public override void OnActionExecuting(HttpActionContext actionContext)
{
// stuff goes here
var content = actionContext.Request.Content.ReadAsStringAsync().Result;
// content is always empty because request body is cleared
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
// other stuff goes here
var content = actionContext.Request.Content.ReadAsStringAsync().Result;
// content is always empty because request body is cleared
}
// ..
}
С другой стороны, я применил атрибут FromBody перед классом параметров действия, чтобы воспользоваться его преимуществами.
[Log]
public class SomethingController
{
public HttpResponseMessage Foo([FromBody] myModel)
{
// something
}
}
Проблема заключается в том, что содержимое всегда пустое в ActionExecuting или ActionExecuted.
Я думаю, что это потому, что FromBody работает до моего атрибута Log в отличие от их порядка в коде. И снова я думаю, что это из-за поиска лучшего соответствия action/controller для запроса в соответствии с параметрами действия (Route Processing). После этого тело запроса очищается, так как тело запроса не забуферировано в WebApi.
Я хочу знать, есть ли способ изменить время выполнения атрибута FromBody и атрибут Log? или что-то еще, что решает проблему! Я должен упомянуть, что я не хочу удалять FromBody и использовать HttpRequestMessage вместо моей модели или что-то в этом роде.
рядом это ваше обращение асинхронного неправильно. Использование .Result опасно, вам следует избегать этого, если возможно. Скорее переопределите метод OnActionExecutingAsync, который позволяет вам ждать. –
@ LukasK на самом деле это было написано, чтобы объяснить мой вопрос. но ты прав. –