【问题标题】:visitors IP address doesnt show访客 IP 地址不显示
【发布时间】:2020-12-05 20:24:30
【问题描述】:

我在获取访问者 IP 地址时遇到问题 我正在使用 asp net mvc 不幸的是,我使用以下代码保存了访问者的 IP 地址它在我的本地网络上不起作用,许多人从 LAN 访问了我的页面,但没有捕获其中任何一个,我有一个包含许多页面的网站,如果用户访问另一个页面也是问题它根本不会捕获,因为我在 Home 索引中有代码 请让我知道我的代码有什么问题以及我必须将代码放在项目中的哪个位置,以便如果用户单击链接而不是主页,它将捕获任何页面的访问者 这是我的代码 家庭控制器

public ActionResult Index()
        {
            string currip = string.Empty;
            if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
            {
                currip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
            }
            else if (System.Web.HttpContext.Current.Request.UserHostAddress.Length != 0)
            {
                currip = System.Web.HttpContext.Current.Request.UserHostAddress;

            }
         //   string currip = HttpContext.Request.UserHostAddress.ToString(); // tried this didnt work it gave me single ip for all visitors 
             //   vs.Ip = currip;
                vs.Ip = HttpContext.Request.UserHostAddress.ToString();
                vs.lastaccess = DateTime.Now;
                vs.visits += 1;
                _db.SaveChanges();           
           
           return view();
}

更新 使用时 currip = System.Web.HttpContext.Current.Request.UserHostAddress; 对于 post 方法添加登录信息 ip 出现但对于访问它没有出现,因为它是 get 方法 有什么关系吗?

【问题讨论】:

  • 这可能是由于防火墙/DMZ/NAT。
  • 我对此一无所知,我们正处于测试阶段,所以我不确定我们是否托管它是否可以使用当前代码,如果用户登录,我已经尝试过了currip = System.Web.HttpContext.Current.Request.UserHostAddress;但不访问
  • @Progman 不,它没有
  • 请记住,您可能需要调整防火墙/转发器/负载平衡器配置以传递任何这些标头

标签: c# asp.net asp.net-mvc ip-address


【解决方案1】:

除了我尝试过但没有工作的 Wowo Ot 答案之外,答案在逻辑上是正确的,但我的代码的问题是 旧代码

vs.visits += 1;
_db.SaveChanges();   

我不得不编辑我的代码 到

vs.visits += 1;
_db.visit.add(vs); // here was the missing code 
_db.SaveChanges();   

【讨论】:

    【解决方案2】:
    public static string getIPAddress(HttpRequestBase request)
        {
            string ipAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (string.IsNullOrEmpty(ipAddress))
            {
                ipAddress = request.ServerVariables["REMOTE_ADDR"];
            }
    
            return ipAddress;
        }
    

    更新

    您可以使用访问属性

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public sealed class VisitAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var descriptor = filterContext.ActionDescriptor;
            var controller = descriptor.ControllerDescriptor.ControllerName;
            var action = descriptor.ActionName;
            var user = filterContext.HttpContext.User.Identity.Name;
    
            // your code here 
         }
    }
    

    然后你可以像这样调用你的控制器或动作:

    [Visit]
    public class YourController : Controller
    {
    
    }
    

    【讨论】:

    • 谢谢@Wowo Ot,如果我想在应用程序从任何页面启动时调用此函数,而不是从主页开始放置它以及我应该在调用函数中传递什么参数?
    • 您可以将其添加为中间件,提取一次,然后将其作为会话变量传递到每个页面。
    • 您的答案在逻辑上看起来是正确的,但我不知道如何实现它,请您让我知道如何将所有这些组合在一起,您的代码在这里的意思是我应该将答案的第一部分放在那里请澄清
    • 是的,您将放置“getIPAddress”和用于插入数据库的代码。您可以将“VisitAttribute”类放在任何类中或为其创建一个新类。
    • 非常感谢,请告诉我要在函数内部传递的参数 string curip = getIPAddress(这里要写什么);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2017-01-03
    相关资源
    最近更新 更多