【问题标题】: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;
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 2016-04-08
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        相关资源
        最近更新 更多