C# 在ASP NET Web API中捕获用户上次请求时间戳

C# 在ASP NET Web API中捕获用户上次请求时间戳,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我正在ASP.NET Web API生命周期中寻找一个好位置来更新我的用户实体中的属性,该属性用于存储用户上次发出请求的日期和时间。显然,我可以将代码添加到我的每个控制器方法中,但我更喜欢在控制器之外的一个地方执行此操作 理想情况下,我可以访问用户主体,并可以使用其Identity属性获取用户ID,以便使用entity Framework检索和更新我的用户实体 我目前正在考虑使用DelegatingHandler实现 有人能建议我在生命周期中应该在哪里执行此操作吗?请提供一个代码示例。我将为您的

我正在ASP.NET Web API生命周期中寻找一个好位置来更新我的用户实体中的属性,该属性用于存储用户上次发出请求的日期和时间。显然,我可以将代码添加到我的每个控制器方法中,但我更喜欢在控制器之外的一个地方执行此操作

理想情况下,我可以访问用户主体,并可以使用其Identity属性获取用户ID,以便使用entity Framework检索和更新我的用户实体

我目前正在考虑使用DelegatingHandler实现


有人能建议我在生命周期中应该在哪里执行此操作吗?请提供一个代码示例。

我将为您的控制器创建一个属性,以便使用ActionFilter在您的用户实体上执行更新。 此示例说明如何为控制器方法创建属性,方法与此相同:

b、 e,您的控制器如下所示:

[SaveUserRequest]
public class HomeController : ApiController

创建ActionFilter:

public class LogActionFilter : ActionFilterAttribute 
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        // Do your work
    }
}

是的,但是我不是必须将ActionFilter添加到每个控制器方法中吗

不,您可以将其应用于控制器或操作

或者,您可以执行以下操作,而不必将其应用于每个控制器(有点像全局过滤器):

然后你想继承就继承吧

最后,另一个选项是通过查找App_Start/FilterConfig.cs添加到全局过滤器,并添加:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new LogActionFilter());
}

因此,我已经向您展示了如何将其应用于操作级别、控制器级别、一个或多个控制器但不是所有控制器,然后如何将其应用于所有控制器(全局)。

您可以从“是”开始,但我不必将ActionFilter添加到每个控制器方法吗?接下来,将此添加到一个基本控制器,您可以在需要函数的地方继承它。这也是一个好主意@Jasen。将CodingYoshi和Jasen建议的解决方案结合起来。对,我知道这是一种可能性,但我必须将此属性添加到每个控制器方法中。我在控制器的上游寻找一些东西。你只需将属性放在控制器上,而不是每个方法上等等,你刚才说……如果不想为每个controllerWait添加属性,你还可以将其添加为全局actionfilter,你刚才说我不必把它应用到每个控制器上,但你的例子正好说明了这一点。如何全局应用它。请仔细阅读我的答案:如果您想将它应用于某些控制器,请使用我所展示的继承。如果您想将其应用于所有控制器(全局),请使用最后一个选项。谢谢@CodingYoshi我选择您的答案,因为它是最彻底的。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new LogActionFilter());
}