2016-06-21 37 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;