捕获WebAPI方法调用的响应大小(以字节为单位)

有没有办法在WebAPI中执行此操作而不重新发明轮子? 我可以很容易地获得通过WebAPI返回的对象的大小,但当然有标题和序列化开销。 由于我们按带宽利用率收费,我想知道我们的响应有多大,但似乎没有明显的机制。

编辑要清楚,我正在寻找一种以编程方式执行此操作的方法,以便我可以报告,分析和预测使用情况,因此我不会对账单感到惊讶。

这是一个消息处理程序,可以获取您要查找的大小,

public class ResponseSizeHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); if (response.Content != null) { await response.Content.LoadIntoBufferAsync(); var bodylength = response.Content.Headers.ContentLength; var headerlength = response.Headers.ToString().Length; } return response; } } 

只需添加此处理程序的实例作为第一个消息处理程序。

 config.MessageHandlers.Add(new ResponseSizeHandler()); 

不要担心LoadIntoBufferAsync ,除非你实际上做流媒体内容,否则几乎所有内容都由主机缓冲,所以在管道中稍早做一下就不会增加额外的开销。

您可以使用Chrome F12开发人员工具及其网络标签或Fiddler工具来获取特定HTTP响应的内容长度。

在Chrome中(例如) –

在此处输入图像描述

在Fiddler(例如) –

在此处输入图像描述

UPDATE

在Web API中,您可以使用DelegatingHandler来记录响应,在DelegatingHandler中,您可以像这样获取ContentLength,面对面,您也可以获得所有标题和响应 –

 return base.SendAsync(request, cancellationToken).ContinueWith((task) => { HttpResponseMessage response = task.Result; var contentLength = response.Content.Headers.ContentLength; return response; });