有没有办法在WebAPI中执行此操作而不重新发明轮子?我可以很容易地获得通过WebAPI返回的对象的大小,但当然有标题和序列化开销。由于我们按带宽利用率收费,我想知道我们的响应有多大,但似乎没有一个明显的机制。
修改 为了清楚起见,我正在寻找一种以编程方式执行此操作的方法,以便我可以报告,分析和预测使用情况,因此我不会对账单感到惊讶。
答案 0 :(得分:10)
这是一个消息处理程序,可以获取您要查找的大小,
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
,除非你实际上是流媒体内容,否则几乎所有的内容都是由主机缓冲的,所以在管道中稍早做一下就不会增加任何额外的开销。 / p>
答案 1 :(得分:1)
您可以使用Chrome F12 Developer Tools及其网络标签或Fiddler tool来获取特定HTTP响应的内容长度。
在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;
});