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
相关产品推荐
相关产品推荐

