【问题标题】:How to get caller caller IP address in Application_Start如何在 Application_Start 中获取呼叫者呼叫者 IP 地址
【发布时间】:2015-12-25 10:42:30
【问题描述】:
如何在 ASP.NET MVC4 Global.asax.cs Application_Start 事件中获取调用者 IP 地址?
HttpContext.Current.Request 对象在那里不可用。
Thread.CurrentPrincipal.Identity 存在。
我想记录用于启动应用程序的用户名和 IP 地址。
MVC4 应用程序在 Windows 和 Mono 中运行
【问题讨论】:
标签:
asp.net
asp.net-mvc
asp.net-mvc-4
global-asax
【解决方案1】:
正如您在ASP.NET Lifecycle on MSDN 中看到的那样,Application_Start 事件不仅在构建请求对象的AcquireRequestState 事件之前很久就发生了,而且它也完全在请求生命周期之外完成。换句话说,Application_Start 仅在应用程序启动或应用程序池回收时出现一次,而不是每个请求一次。
所以,你的问题的答案就是你不能这样做(当然,除非你在 Application_Start 事件中设置一个静态变量并使用 Application_BeginRequest 作为 Darin 的答案或 MVC 过滤器来实际做日志记录)。
但 MVC 包含 authorization filters and action filters,用于实现横切关注点,例如记录和/或审核当前用户的 IP 地址。在创建请求对象之前,授权和操作过滤器不会运行。
【解决方案2】:
应用程序启动时 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;
}
}
}
}