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

C# ApiController中如何获取请求方的IP地址及其他相关信息

ASP.NET Web API ApiController 获取请求方信息实现方案

核心实现代码

你可以直接参考以下代码补全业务逻辑,代码兼容常规IIS托管、反向代理托管、自托管等多种部署场景:

public class ExampleController : ApiController
{
    [HttpGet]
    [HttpPost]
    public HttpResponseMessage GetStuff(HttpRequestMessage message)
    {
        // 获取请求方IP地址
        var requestorIP = GetClientIp(message);
        
        // 其他常用请求方信息获取示例
        var userAgent = HttpContext.Current.Request.UserAgent; // 客户端浏览器/设备标识
        var acceptLanguages = HttpContext.Current.Request.UserLanguages; // 客户端接受的语言列表
        var requestMethod = HttpContext.Current.Request.HttpMethod; // 请求方法
        var isAuthenticated = HttpContext.Current.Request.IsAuthenticated; // 请求是否已身份认证
        var loginUserName = HttpContext.Current.User?.Identity?.Name; // 已认证的用户名

        // 此处编写你的业务逻辑
        return Request.CreateResponse(HttpStatusCode.OK, new
        {
            ClientIp = requestorIP,
            DeviceInfo = userAgent
        });
    }

    /// <summary>
    /// 封装的客户端IP获取方法,兼容反向代理场景
    /// </summary>
    private string GetClientIp(HttpRequestMessage request = null)
    {
        // 优先从HttpRequestMessage对象提取,兼容自托管场景
        if (request != null && request.Properties.ContainsKey("MS_HttpContext"))
        {
            var contextWrapper = request.Properties["MS_HttpContext"] as HttpContextWrapper;
            if (contextWrapper != null)
            {
                // 优先取反向代理传递的真实IP头
                var forwardIp = contextWrapper.Request.Headers["X-Forwarded-For"];
                if (!string.IsNullOrWhiteSpace(forwardIp))
                {
                    return forwardIp.Split(',')[0].Trim();
                }
                return contextWrapper.Request.UserHostAddress;
            }
        }

        // 兜底从当前HttpContext取
        if (HttpContext.Current != null)
        {
            var forwardIp = HttpContext.Current.Request.Headers["X-Forwarded-For"];
            if (!string.IsNullOrWhiteSpace(forwardIp))
            {
                return forwardIp.Split(',')[0].Trim();
            }
            return HttpContext.Current.Request.UserHostAddress;
        }

        return string.Empty;
    }
}

其他可获取的请求方信息

你可以通过HttpContext.Current.Request对象获取更多请求维度的信息,常见的有:

  • 所有请求头字段:遍历HttpContext.Current.Request.Headers即可获取所有客户端传递的请求头信息
  • 客户端请求地址、请求参数、请求体内容
  • 客户端支持的内容编码、接受的响应内容类型
  • 客户端请求的Cookie信息
  • 客户端端口号、服务端接收请求的端口等网络信息

注意:如果你的服务部署在Nginx、CDN等反向代理服务后面,需要配置反向代理透传X-Forwarded-For头才能拿到真实的客户端IP,否则获取到的会是代理服务器的IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:00:00