C# 在Web API Asp.net的自定义筛选器中获取WebHostHttpRequestContext

C# 在Web API Asp.net的自定义筛选器中获取WebHostHttpRequestContext,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我目前正在尝试在我的Web API中编写一个自定义过滤器,当用户根据其上次活动时间戳发出请求时,该过滤器允许我更新数据库。要做到这一点,我需要访问他们的用户名,该用户名在WebHostHttpRequestContext中可用,并且在调试和深入几层时可以查看,但我似乎不知道如何使用代码访问它 知道我如何访问这个对象并从中获取值吗?这是我目前正在做的工作 using System; using System.Collections.Generic; using System.Linq; using

我目前正在尝试在我的Web API中编写一个自定义过滤器,当用户根据其上次活动时间戳发出请求时,该过滤器允许我更新数据库。要做到这一点,我需要访问他们的用户名,该用户名在WebHostHttpRequestContext中可用,并且在调试和深入几层时可以查看,但我似乎不知道如何使用代码访问它

知道我如何访问这个对象并从中获取值吗?这是我目前正在做的工作

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();
            //}
        }
    }
}

如果你要找的是校长。尝试通过
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();
                }
            }
        }
    }
}

尽管该类是内部的,但您可以将WebHostHttpContext对象视为动态对象,并从actionExecutedContext.Request.Properties[“MS_RequestContext”]获取它

例如,当我需要来自请求上下文的原始HttpRequestWrapper(以获取POST body数据)时,下面的代码起作用

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

这太棒了,谢谢你,我现在没有机会尝试,但明天会尝试,但这正是我今天一直在寻找的,谢谢!