2016-06-21 78 views
1

我正在嘗試在Web API中編寫自定義過濾器,以便在用戶根據其LastActivity時間戳發出請求時更新我們的數據庫。要做到這一點,我需要訪問WebHostHttpRequestContext中可用的用戶名,並且在調試並關閉一些圖層時可以查看,但我似乎無法弄清楚如何使用我的代碼訪問它。在Web API的自定義過濾器中獲取WebHostHttpRequestContext Asp.net

任何想法如何訪問此對象並從中獲取值?這是我目前的工作,

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Http.Filters; 
using MyWebAPI.Models.DAL; 

namespace MyWebAPI.App_Service 
{ 
    public class MyActionFilter : System.Web.Http.Filters.ActionFilterAttribute 
    { 
     public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
     { 

      var principal = actionExecutedContext.Response.Content; 

      //using (var db = new databaseContext()) 
      //{ 
      // var dbUser = (from b in db.AspNetUsers 
      //     where b.UserName == principal.Identity.Name 
      //     select b).First(); 

      // dbUser.LastActivity = DateTime.Now; 
      // db.SaveChanges(); 
      //} 
     } 
    } 
} 

回答

2

如果你以後是校長。嘗試通過HttpActionExecutedContext.ActionContext.RequestContext.Principal訪問它。如果請求已通過身份驗證並且已將用戶主體分配給請求,則應該填充它。

namespace MyWebAPI.App_Service { 
    public class MyActionFilter : System.Web.Http.Filters.ActionFilterAttribute { 
     public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext) { 

      var principal = actionExecutedContext.ActionContext.RequestContext.Principal; 
      if(principal != null) { 
       using (var db = new databaseContext()) { 
        var dbUser = (from b in db.AspNetUsers 
           where b.UserName == principal.Identity.Name 
           select b).First(); 

        dbUser.LastActivity = DateTime.Now; 
        db.SaveChanges(); 
       } 
      } 
     } 
    } 
} 
+0

這真是太好了,謝謝,我現在沒有機會嘗試它,但是明天會有,但這感覺就像我今天一直在尋找的感謝! – tokyo0709

0

雖然類是內部的,您可以把一個WebHostHttpContext對象作爲一個動態的,從actionExecutedContext.Request.Properties [「MS_RequestContext」]得到它。

例如,當我需要來自我的請求上下文(獲取POST正文數據)的原始HttpRequestWrapper時,下面的代碼工作。

dynamic requestContext = actionContext.Request.Properties["MS_RequestContext"]; 
var requestWrapper = (HttpRequestWrapper)requestContext.Context.Request;