【问题标题】:Capture the size of the response (in bytes) of a WebAPI method call捕获 WebAPI 方法调用的响应大小(以字节为单位)
【发布时间】:2014-02-21 12:48:54
【问题描述】:
有没有办法在 WebAPI 中做到这一点而无需重新发明轮子?我可以很容易地获得通过 WebAPI 返回的对象的大小,但当然还有标头和序列化开销。由于我们按带宽利用率收费,我想知道我们的响应有多大,但似乎没有明显的机制可以这样做。
编辑
明确地说,我正在寻找一种以编程方式执行此操作的方法,以便我可以报告、分析和预测使用情况,这样我就不会因账单而感到意外。
【问题讨论】:
标签:
c#
asp.net
asp.net-mvc
asp.net-mvc-4
asp.net-web-api
【解决方案1】:
这是一个消息处理程序,可以获取您正在寻找的大小,
public class ResponseSizeHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> 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,除非你真的做流媒体内容,否则几乎所有的内容都会被主机缓冲,所以在管道中提前一点不会增加任何额外的开销。
【解决方案2】:
您可以使用Chrome F12 Developer Tools 及其网络选项卡或Fiddler tool 来获取特定 HTTP 响应的 Content-Length。
在 Chrome 中(例如)-
在 Fiddler 中(例如)-
更新
在 Web API 中,您可以使用 DelegatingHandler 来记录响应,在 DelegatingHandler 中,您可以像这样获取 ContentLength,您也可以获取所有标头和响应 -
return base.SendAsync(request, cancellationToken).ContinueWith((task) =>
{
HttpResponseMessage response = task.Result;
var contentLength = response.Content.Headers.ContentLength;
return response;
});