I have an attribute named Log
that tries to log the content of request and response into a text file. I've put that over my Controller to cover all the actions. In LogAttribute
I'm reading content as a string (ReadAsStringAsync
) so I don't lose request body.
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
}
// ..
}
On the other hand, I've put the FromBody
attribute before my action parameter class to take advantage of its benefits.
[Log]
public class SomethingController
{
public HttpResponseMessage Foo([FromBody] myModel)
{
// something
}
}
The problem is the content is always empty either in ActionExecuting
or ActionExecuted
.
I think this is because FromBody
runs before my Log
attribute unlike their order in the code. And again I think its because of finding the best action/controller match for the request according to action parameters (Route Processing). After that my request body is cleared since request body is non-buffered in WebApi.
I want to know if there is any way to change the run time order of the FromBody
attribute and my Log
attribute? or something else that solves the problem! I should mention that I don't want to remove the FromBody
and using HttpRequestMessage
instead of my Model or something like that.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…