阅读HttpRequestMessage内容。 DelegatingHandler与ActionFilter

时间:2015-01-08 15:51:01

标签: asp.net asp.net-web-api

我在一些地方读过,不可能不止一次在WebApi中读取请求流的内容,因为它只是前进的。如果您尝试实现AOP样式请求记录器并且还想转储请求的内容,则会出现问题。

我一直在玩它,我注意到如果你尝试在ActionFilter.OnActionExecutingAsync中读取流,如下所示,你会在控制器动作中遇到null内容的问题。

    public override async System.Threading.Tasks.Task OnActionExecutingAsync(System.Web.Http.Controllers.HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
    {
        var content = await actionContext.Request.Content.ReadAsStringAsync();
        traceManager.TraceEvent(TraceEventType.Information, (int)EventId.RequestReceived, "{0}", content);
    }

话虽如此,如果你在DelegatingHandler中实现几乎相同的代码:

     protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
       var content = await request.Content.ReadAsStringAsync();
       traceManager.TraceEvent(TraceEventType.Information, (int)EventId.RequestReceived, "{0}", content);

       return await base.SendAsync(request, cancellationToken);
    }

它完美无缺,并且不会对管道中的所有内容造成任何问题。我知道处理程序比过滤器运行得更早,但为什么可以在管道的一个阶段而不是另一个阶段执行此操作?

0 个答案:

没有答案