2014-09-26 92 views
0

我已經創建了一個ActionFilter來試圖控制我們的API客戶端的數據使用情況,以便我們可以查明行爲異常的客戶端。動作過濾器是微不足道的:計算HttpRequestMessage和HttpResponseMessage總長度

[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); 
    } 
} 

它委託數據使用calulcation到CollectDeviceUsage方法。問題是:我不知道如何獲得請求和響應的實際「字節」大小!我可以得到每個的內容長度,但是這不會考慮標題。這並不需要超級精確的數據使用度量,我對TCP/IP開銷不感興趣,但是我認爲HTTP頭開銷是足夠的。

下面是我用得到教改嘗試,lengh代碼:

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

我怎麼可能還收集實際收到的頁眉/發送lenght?像request.Content.Headers.Length東西:-)

UPDATE

這是非常簡單的獲得請求的標頭的長度:

request.Headers.ToString().Length; 

麻煩現在只能用頭輸入反應謊言。我相信我沒有足夠的信息在OnActionExecuted方法中找出將發送給客戶端的標題,因爲response.Headers返回一個空集合!

+1

這是它作爲執行HEAD的副產品http://www.strathweb.com/2013/03/adding-http-head-support-to-asp-net-web-api/ – MatthewMartin 2014-09-26 17:22:13

+0

@MatthewMartin我已經嘗試迭代request.Headers集合中ToString方法返回一個字符串並連接請求標頭的所有項後,找出它。所以我現在使用它的長度作爲標題長度(我更新了問題)。現在的問題在於響應,因爲似乎我沒有足夠的信息來知道當我的過濾器運行時,Web.API將在響應客戶端時發送哪些標頭... – Loudenvier 2014-09-26 17:27:11

回答

1

您需要一個ResultFilter並在OnResultExecuted方法中進行處理。

您需要確保過濾器是最後一個運行的過濾器,因此請確保指定Last範圍。這將確保即使存在其他結果篩選器,您的篩選器仍會持續運行。

您可能會發現這個page關於過濾器順序和範圍有用(滾動到過濾器順序部分)。

+0

您是天才!我學習ASP.NET MVC的越多,我越喜歡它。由於我通過滲透來了解它,所以我並不贊同它的含義,但是當我需要某些東西時,它似乎被認爲是很好的思想!再次感謝您...... – Loudenvier 2014-09-27 14:44:21

+0

現在唯一的問題是ResultExecutingContext沒有提供一個簡單的方法來獲取我需要獲取操作名稱的Action上下文,等等。我將不得不使用RouteData。我會很快發佈解決方案。 – Loudenvier 2014-09-27 14:59:17

+0

是的,你贏了一些你輸了一些。想不起我的頭頂,也許我會嘗試當我在我的電腦前。 – Mrchief 2014-09-27 15:08:46