Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算HttpRequestMessage和HttpResponseMessage的总长度_C#_Asp.net Mvc - Fatal编程技术网

C# 计算HttpRequestMessage和HttpResponseMessage的总长度

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

我创建了一个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头开销是足够考虑的。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得到它。