正在计算HttpRequestMessage和HttpResponseMessage的总长度

本文关键字:HttpResponseMessage 计算 HttpRequestMessage | 更新日期: 2023-09-27 18:24:38

我创建了一个ActionFilter,试图控制API客户端的数据使用,以便我们可以确定行为不端的客户端。动作过滤器很琐碎:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CollectDeviceDataUsageAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
        if (actionExecutedContext.ActionContext.ActionArguments.ContainsKey("id")) {
            long id = (long)actionExecutedContext.ActionContext.ActionArguments["id"];
            var action = actionExecutedContext.ActionContext.ActionDescriptor.ActionName.ToUpper();
            var method = actionExecutedContext.Request.Method.Method;
            var resource = method + " " + action;
            IntegraRepository.CollectDeviceUsage(id.ToString(), resource, actionExecutedContext.Request, actionExecutedContext.Response);
        }
        base.OnActionExecuted(actionExecutedContext);
    }
}

它将数据使用率挖掘委托给CollectDeviceUsage方法。问题是:我不知道如何获得请求和响应的实际"字节"大小!我可以得到每个的内容长度,但这不会考虑标题。这不需要是对数据使用情况的超精确测量,我对TCP/IP开销不感兴趣,但我认为HTTP头开销已经足够考虑了。

这是我用来获取cotent长度的代码:

var sizeReq = request.Content.Headers.ContentLength ?? 0;
var sizeResp = response == null ? 0 : response.Content.Headers.ContentLength ?? 0;

我如何收集实际收到/要发送的邮件头长度?类似请求的东西。Content.Headers.Length:-)

更新

获取请求标头的长度非常简单:

request.Headers.ToString().Length;

现在问题只出在Respone头上。我相信我在OnActionExecuted方法中没有足够的信息来计算将作为响应发送到客户端的Header。标头返回一个空集合!

正在计算HttpRequestMessage和HttpResponseMessage的总长度

您需要一个ResultFilter并用OnResultExecuted方法进行处理。

您需要确保您的筛选器是最后一个运行的筛选器,因此请确保指定Last范围。这将确保即使存在其他结果过滤器,过滤器也能最后运行。

您可能会发现这个关于筛选顺序和范围的页面很有帮助(滚动到"筛选顺序"部分)。

相关文章:
  • 没有找到相关文章