我在一些地方读过,不可能不止一次在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);
}
它完美无缺,并且不会对管道中的所有内容造成任何问题。我知道处理程序比过滤器运行得更早,但为什么可以在管道的一个阶段而不是另一个阶段执行此操作?