Asp.net 正在读取HttpRequestMessage内容。DelegatingHandler与ActionFilter

Asp.net 正在读取HttpRequestMessage内容。DelegatingHandler与ActionFilter,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,我在一些地方读到过,不可能在WebApi中多次读取请求流的内容,因为它只是向前的。如果您试图实现AOP样式的请求记录器,并且还希望转储请求的内容,则会出现问题 我一直在使用它,我注意到如果您尝试在ActionFilter.OnActionExecutingAsync中读取流,如下所示,您会在控制器操作中遇到空内容问题 public override async System.Threading.Tasks.Task OnActionExecutingAsync(System.Web.Ht

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

我一直在使用它,我注意到如果您尝试在ActionFilter.OnActionExecutingAsync中读取流,如下所示,您会在控制器操作中遇到空内容问题

    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);
    }
受保护的覆盖异步System.Threading.Tasks.Task SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
var content=wait request.content.ReadAsStringAsync();
traceManager.TraceEvent(TraceEventType.Information,(int)EventId.RequestReceived,“{0}”,内容);
返回wait base.sendaync(请求、取消令牌);
}
它工作完美无瑕,不会对管道下游的任何东西造成任何问题。我知道处理程序的运行速度比过滤器快得多,但为什么可以在管道的一个阶段而不是另一个阶段执行此操作