【发布时间】:2014-02-16 13:34:15
【问题描述】:
我有一个名为Log 的属性,它尝试将请求和响应的内容记录到文本文件中。我已经把它放在我的控制器上以涵盖所有操作。在 LogAttribute 中,我将内容作为字符串 (ReadAsStringAsync) 读取,因此我不会丢失请求正文。
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 属性之前运行,这与它们在代码中的顺序不同。我再次认为这是因为根据操作参数(路由处理)找到请求的最佳操作/控制器匹配。之后我的请求正文被清除,因为请求正文在 WebApi 中没有缓冲。
我想知道是否有任何方法可以更改FromBody 属性和我的Log 属性的运行时间顺序?或其他解决问题的方法!我应该提一下,我不想删除 FromBody 并使用 HttpRequestMessage 代替我的模型或类似的东西。
【问题讨论】:
-
除此之外,您的异步处理是错误的。使用 .Result 是危险的,如果可能的话,你应该避免这种情况。而是覆盖允许您等待的 OnActionExecutingAsync 方法。
-
@LukasK 实际上这是为了解释我的问题而写的。但你是对的。
标签: c# asp.net asp.net-mvc asp.net-web-api