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

4
有没有不重复造轮子的情况下使用WebAPI实现此功能的方法?我可以很容易地获取通过WebAPI返回的对象的大小,但是当然还有头信息和序列化开销。由于我们按带宽使用量计费,我想知道我们的响应有多大,但似乎没有明显的机制可以做到这一点。
编辑: 明确一下,我正在寻找一种编程方式来实现此功能,以便我可以报告、分析和预测使用情况,以免被账单所困扰。
2个回答

20

这是一个消息处理程序,可以获取您所需要的尺寸。

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,除非您确实需要流式内容,否则几乎所有内容都会被主机缓冲,因此在管道中稍早执行它不会增加任何额外的开销。


嗨Darrel,我们如何知道我们是在流式传输内容还是缓冲它? - Helen Araya

1
你可以使用Chrome F12开发者工具及其网络选项卡或Fiddler工具获取特定HTTP响应的Content-Length。
在Chrome中(例如)-

enter image description here

在Fiddler(例如)中 -

enter image description here

更新

在Web API中,您可以使用DelegatingHandler记录响应,在DelegatingHandler中,您可以像这样获取ContentLength,实际上您可以获取所有标头和响应 -

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

代码 response.Content.Headers.ContentLength; 返回 null。它不起作用。 - Helen Araya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接