c# – 在ActionFilter中获取Request Body

出于日志记录的目的,我试图监视通过WebAPI发出的请求.我已创建并且我正在寻找一种方法,在请求完成并回复后,在请求中返回已发送的正文.我试图通过使用ActionFilter来做到这一点,但迄今为止从请求中读取正文失败了.

任何人都可以提供一些建议我如何获取这些信息?

对于上下文,我试图在此代码中执行此操作:

public class LoggingActionFilter : ActionFilterattribute
    {
        public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext,CancellationToken cancellationToken)
        {
            var test = actionExecutedContext.Request.Content.ReadAsstringAsync().Result;

            return base.OnActionExecutedAsync(actionExecutedContext,cancellationToken);
        }
    }

我已经尝试回读actionExecutedContext变量上的内容以便返回正文但是发现这只是为了返回空白到目前为止.

解决方法

你只是处理请求体,所以不需要使用OnActionExecutedAsync方法,你可以像这样覆盖OnActionExecuting,
public override void OnActionExecuting(HttpActionContext actionContext)

   {
       var test = (actionContext.Request.Content as ObjectContent).Value.ToString();
       // your logging code here
   }

WebAPI中另一个可用的选项是DelegatingHandler.如果你只想记录请求体,那么重写SendAsync方法,

public class ApiLogHandler : DelegatingHandler
{
 protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
 {
   var requestBody = request.Content.ReadAsstringAsync().Result;
   // your logging code here
   return base.SendAsync(request,cancellationToken);
 }
}

如果您决定选择DelegatingHandler,则需要将该处理程序注册到Global消息处理程序.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...