我已经创建了一个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返回一个空集合!
答案 0 :(得分:1)
您需要ResultFilter
并使用OnResultExecuted
方法进行处理。
您需要确保过滤器是最后一个要运行的过滤器,因此请确保指定Last
范围。即使存在其他结果过滤器,这也可确保您的过滤器最后运行。
您可能会发现此page有关过滤器顺序和范围的帮助(滚动到过滤器订单部分)。