如何在 Application_Start 中获取来电者的来电者 IP 地址

How to get caller caller IP address in Application_Start

如何在 ASP.NET MVC4 Global.asax.cs Application_Start 事件中获取调用方 IP 地址? HttpContext.Current.Request 那里没有对象。 Thread.CurrentPrincipal.Identity 存在。

我想记录用于启动应用程序的用户名和 IP 地址。

MVC4 应用程序在 Windows 和 Mono

中运行

正如您在 ASP.NET Lifecycle on MSDN 中看到的那样,Application_Start 事件不仅发生在构建请求对象的 AcquireRequestState 事件之前很久,它也是带外完成的与请求生命周期完全一致。换句话说,Application_Start 仅在应用程序启动或应用程序池回收时发生一次,而不是每个请求一次。

所以,您的问题的答案很简单,就是您不能这样做(当然,除非您在 Application_Start 事件中设置了一个静态变量,并像 Darin 的回答那样使用 Application_BeginRequest或 MVC 过滤器来实际执行日志记录)。

但是 MVC 包括 authorization filters and action filters,它们用于实现横切关注点,例如记录 and/or 当前用户 IP 地址的审计。授权和操作过滤器 运行 直到创建请求对象之后。

应用程序启动时,HttpContext 不可用。您可以在 global.asax:

中的 BeginRequest 方法中实现
private static bool initialized = false;
private static object syncRoot = new object();
protected void Application_BeginRequest()
{
    if (!initialized)
    {
        lock (syncRoot)
        {
            if (!initialized)
            {
                // do your stuff with the user IP getting from the current context
                initialized = true;
            }
        }
    }
}