正在计算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。标头返回一个空集合!
您需要一个ResultFilter
并用OnResultExecuted
方法进行处理。
您需要确保您的筛选器是最后一个运行的筛选器,因此请确保指定Last
范围。这将确保即使存在其他结果过滤器,过滤器也能最后运行。
您可能会发现这个关于筛选顺序和范围的页面很有帮助(滚动到"筛选顺序"部分)。