计算HttpRequestMessage和HttpResponseMessage的总长度

时间:2014-09-26 17:11:49

标签: c# asp.net-mvc

我已经创建了一个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方法。问题是:我不知道如何获得Request和Response的实际“字节”大小!我可以获得每个内容长度,但这不会考虑标题。这不需要是超精确的数据使用量度量,我对TCP / IP开销不感兴趣,但我认为HTTP头部开销足以考虑。

以下是我用来获取cotent-lengh的代码:

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

我怎样才能收集收到/要发送的实际标题?像request.Content.Headers.Length: - )

更新

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

request.Headers.ToString().Length;

麻烦现在只有Respone标题。我相信我在OnActionExecuted方法上没有足够的信息来确定将发送给客户端的Headers,因为response.Headers返回一个空集合!

1 个答案:

答案 0 :(得分:1)

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

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

您可能会发现此page有关过滤器顺序和范围的帮助(滚动到过滤器订单部分)。