You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#获取登录网站的客户端IP地址及设备名称(解决返回服务器信息问题)

解决客户端IP与设备名获取的问题

我太懂你的困扰了——本地测试时代码能拿到自己PC的信息,一部署到服务器就变成服务器的IP和名称,这是因为你用的方法本来就是获取**运行代码的机器(也就是服务器)**的信息,完全和客户端不搭边。咱们一步步来解决:

为什么原来的代码不行?

  • Dns.GetHostName() 和 Dns.GetHostEntry():这俩方法是拿当前程序运行所在机器的主机名和IP,本地跑就是你的PC,服务器上跑自然就是服务器的信息,跟客户端半毛钱关系都没有。
  • 你尝试的HttpContext方法如果没处理代理场景,也会拿到服务器或者反向代理的IP——毕竟很多生产环境里,请求会先经过Nginx、IIS ARR这类代理服务器再到你的应用。

获取客户端真实IP的正确方法

要拿到客户端的真实IP,必须考虑代理的情况,优先从请求头里的X-Forwarded-For或X-Real-IP取,这些头是代理服务器用来传递原始客户端IP的。下面是ASP.NET(非Core)的示例代码:

public string GetClientIPAddress()
{
    var context = System.Web.HttpContext.Current;
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    // 如果没有X-Forwarded-For头,直接取REMOTE_ADDR
    if (string.IsNullOrEmpty(ipAddress))
    {
        ipAddress = context.Request.ServerVariables["REMOTE_ADDR"];
    }
    // 多层代理的话,X-Forwarded-For会有多个IP,取第一个原始客户端IP
    else if (ipAddress.Contains(","))
    {
        ipAddress = ipAddress.Split(',').First().Trim();
    }
    return ipAddress;
}

获取客户端设备信息(设备名)

这里要敲黑板:HTTP请求本身不会主动发送客户端的设备主机名(比如你的PC名称"DESKTOP-XXXX"),所以有两种方式获取设备相关信息:

1. 通过User-Agent头解析

客户端浏览器会发送User-Agent头,里面包含设备系统、浏览器类型等信息,你可以解析这个头来判断设备类型。如果需要更精准的解析,可以用第三方库(比如UAParser.NET),下面是简单的示例:

public string GetClientDeviceInfo()
{
    var context = System.Web.HttpContext.Current;
    string userAgent = context.Request.UserAgent;
    
    if (string.IsNullOrEmpty(userAgent))
        return "Unknown Device";

    if (userAgent.Contains("Windows NT"))
        return "Windows PC";
    else if (userAgent.Contains("Mac OS X"))
        return "Mac PC";
    else if (userAgent.Contains("iPhone") || userAgent.Contains("iPad"))
        return "Apple iOS Device";
    else if (userAgent.Contains("Android"))
        return "Android Device";
    else
        return "Unknown Device";
}

2. 客户端主动提交设备名

如果确实需要客户端的主机名(比如局域网内的场景),可以用JavaScript获取客户端的主机名,然后通过表单或AJAX提交到服务器:

// 客户端JS代码
var deviceName = window.location.hostname; 
// 然后把deviceName提交到服务器接口

重要提醒

公网环境下几乎不可能直接获取客户端的主机名(比如你的PC名称"DESKTOP-XXXX"),因为这个信息不会通过HTTP请求传递,而且大多数客户端是动态IP,没有反向DNS记录可以解析。所以如果你的需求是设备类型,用User-Agent解析就足够了;如果是局域网内的设备名称,才考虑客户端主动提交的方式。

内容的提问来源于stack exchange,提问作者Ashutosh Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:38:39