C# 计算HttpRequestMessage和HttpResponseMessage的总长度
我创建了一个ActionFilter,试图控制我们的API客户端的数据使用,以便我们能够查明行为不端的客户端。操作筛选器非常简单:C# 计算HttpRequestMessage和HttpResponseMessage的总长度,c#,asp.net-mvc,C#,Asp.net Mvc,我创建了一个ActionFilter,试图控制我们的API客户端的数据使用,以便我们能够查明行为不端的客户端。操作筛选器非常简单: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class CollectDeviceDataUsageAttribute : ActionFilterAttribute { public override void OnActionExecuted(Http
[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头开销是足够考虑的。p>
下面是我用来获取cotent长度的代码:
var sizeReq = request.Content.Headers.ContentLength ?? 0;
var sizeResp = response == null ? 0 : response.Content.Headers.ContentLength ?? 0;
如何收集实际接收/发送的邮件头?类似request.Content.Headers.Length:-)
更新
获取请求头的长度非常简单:
request.Headers.ToString().Length;
现在的问题只在于Respone头。我相信我在OnActionExecuted方法中没有足够的信息来计算将发送到客户端的头,因为响应是这样的。头返回一个空集合 您需要一个
ResultFilter
并在方法中进行处理
您需要确保您的筛选器是最后一个运行的筛选器,因此请确保指定范围。这将确保即使存在其他结果筛选器,您的筛选器也会最后运行
您可能会发现关于过滤器顺序和范围的内容很有帮助(滚动到过滤器顺序部分)。这是实现HEAD@MatthewMartin的副产品,我在尝试遍历request.Headers集合中的所有项后发现,ToString方法返回一个字符串,其中包含连接的请求头。所以我现在使用它的长度作为标题长度(我已经更新了这个问题)。现在的问题在于响应,因为我似乎没有足够的信息来知道在运行筛选器时Web.API将在响应中向客户端发送哪些标头…你真是天才!我学习ASP.NETMVC越多,我就越喜欢它。因为我是通过潜移默化来学习的,所以我现在还不去摸索那些细节,但是每当我需要一些东西的时候,它似乎都是经过深思熟虑的!再次感谢您…现在唯一的问题是ResultExecutingContext没有提供一种简单的方法来获取操作上下文,我需要获取操作名称等。我必须使用RoutedData。我很快就会发布解决方案。是的,你赢了就输了。我脑子里想不出来,也许我会在电脑前试试。不用担心!我可以很容易地从RouteData得到它。