重点是拿到HttpContext 对象。

先从Headers["Cdn-Src-Ip"] 中取IP,其次从Headers["X-Forwarded-For"] 取,最后从context.Connection.RemoteIpAddress 中取。

有可能遇到“::ffff:192.168.2.131” 这种IP,把"::ffff:"Replace掉。

工具类CoreMvcClientIpUtil:

namespace CommonUtils
{
public static class CoreMvcClientIpUtil
{
public static string GetClientIP(HttpContext context)
{
var ip = context.Request.Headers["Cdn-Src-Ip"].FirstOrDefault();
if (!string.IsNullOrEmpty(ip))
return IpReplace(ip); ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (!string.IsNullOrEmpty(ip))
return IpReplace(ip); ip = context.Connection.RemoteIpAddress.ToString(); return IpReplace(ip);
} static string IpReplace(string inip)
{
//::ffff:
//::ffff:192.168.2.131 这种IP处理
if (inip.Contains("::ffff:"))
{
inip = inip.Replace("::ffff:", "");
}
return inip;
} }
}

一、使用HttpContextAccessor

在Program.cs中增加一行:

//获取IP使用
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews(); //获取IP使用
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); var app = builder.Build(); // Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();

修改Controller:

全局变量增加

private readonly IHttpContextAccessor _httpContextAccessor;

构造函数增加

_httpContextAccessor = httpContextAccessor;

Action中获取IP

var ip = CoreMvcClientIpUtil.GetClientIP(_httpContextAccessor.HttpContext);

using CommonUtils;
using CommonUtils.Extensions;
using Microsoft.AspNetCore.Mvc; namespace AspNetCoreMvcClientIp2.Controllers
{
public class OkController : Controller
{
private readonly IHttpContextAccessor _httpContextAccessor; public OkController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
// GET: OkController
public ActionResult Index()
{
var ip = CoreMvcClientIpUtil.GetClientIP(_httpContextAccessor.HttpContext);
ViewBag.myip1 = "ip:" + ip; //直接实例化HttpContextAccessor
IHttpContextAccessor ih = new HttpContextAccessor();
string ip2 = CoreMvcClientIpUtil.GetClientIP(ih.HttpContext);
ViewBag.myip2 = "ip2:" + ip2; //使用ControllerBase的HttpContext
var ip3 = CoreMvcClientIpUtil.GetClientIP(HttpContext);
ViewBag.myip3 = "ip3:" + ip3; //扩展方法
var ip4 = HttpContext.GetClientIP();
ViewBag.myip4 = "ip4:" + ip4; return View();
} }
}

也可以直接实例化HttpContextAccessor:

IHttpContextAccessor ih = new HttpContextAccessor();
string ip2 = CoreMvcClientIpUtil.GetClientIP(ih.HttpContext);

二、使用ControllerBase的HttpContext

//使用ControllerBase的HttpContext
var ip3 = CoreMvcClientIpUtil.GetClientIP(HttpContext);
ViewBag.myip3 = "ip3:" + ip3;

三、扩展HttpContext

using Microsoft.AspNetCore.Http;

namespace CommonUtils.Extensions
{
public static class HttpContextExtension
{
public static string GetClientIP(this HttpContext context)
{
var ip = context.Request.Headers["Cdn-Src-Ip"].FirstOrDefault();
if (!string.IsNullOrEmpty(ip))
return IpReplace(ip); ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (!string.IsNullOrEmpty(ip))
return IpReplace(ip); ip = context.Connection.RemoteIpAddress.ToString(); return IpReplace(ip);
} static string IpReplace(string inip)
{
//::ffff:
//::ffff:192.168.2.131 这种IP处理
if (inip.Contains("::ffff:"))
{
inip = inip.Replace("::ffff:", "");
}
return inip;
}
}
}

在Controller中使用时要using CommonUtils.Extensions;

var ip4 = HttpContext.GetClientIP();
ViewBag.myip = "ip4:" + ip4;

C#.NET6 ASP.NET CORE MVC 获取客户端IP的更多相关文章

  1. 负载均衡的场景下ASP.NET Core如何获取客户端IP地址

    在ASP.NET中,使用负载均衡时,可以通过ServerVariables获取客户端的IP地址. var ip = request.ServerVariables["HTTP_X_FORWA ...

  2. 在ASP.NET Core中获取客户端IP地址

    随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...

  3. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  4. 在ASP.NET Core中获取客户端和服务器端的IP地址(转载)

    随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...

  5. asp.net 获取客户端IP

    一.名词 首先说一下接下来要讲到的一些名词. 在Web开发中,我们大多都习惯使用HTTP请求头中的某些属性来获取客户端的IP地址,常见的属性是REMOTE_ADDR.HTTP_VIA和HTTP_X_F ...

  6. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

    ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...

  7. ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...

  8. ASP.NET Core 中使用负载均衡时获取客户端 IP

    在使用负载均衡的情况下,通过 context.Connection.RemoteIpAddress 获取到的是负载均衡的 IP 地址,需要通过 X-Forwarded-For 请求头才能获取到客户端的 ...

  9. ASP.NET Core MVC里面Razor如何获取URL参数

    原文:ASP.NET Core MVC里面Razor如何获取URL参数 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  10. ASP.NET Core 中文文档 第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

    原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderso ...

随机推荐

  1. 力扣24(java&python)-两两交换链表中的节点(中等)

    题目: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换) 示例 1: 输入:head = [1,2,3,4] 输出:[ ...

  2. CDN应用进阶 | 正确使用CDN 让你更好规避安全风险

    为了帮助用户更好地了解和使用CDN产品,CDN应用实践进阶系统课程开课了.12月17日,阿里云CDN产品专家彭飞在线分享了<正确使用CDN,让你更好规避安全风险>议题,内容主要包括以下几个 ...

  3. 【阿里云EMR实战篇】以EMR测试集群版本为例,详解 Flink SQL Client 集成 Hive 使用步骤

    简介: 以测试集群版本为例(EMR-4.4.1)-- Flink SQL Client 集成 Hive 使用文档 作者:林志成,阿里云EMR产品团队技术支持,拥有多年开源大数据经验 1.以测试集群版本 ...

  4. RedShift到MaxCompute迁移实践指导

    简介: 本文主要介绍Amazon Redshift如何迁移到MaxCompute,主要从语法对比和数据迁移两方面介绍,由于Amazon Redshift和MaxCompute存在语法差异,这篇文章讲解 ...

  5. 如何高效学习 Kubernetes 知识图谱?

    ​简介: Kubernetes 知识图谱遵循云原生人才学习路径搭建课程体系框架,及人才发展路线设置不同阶段,由浅入深,帮助云原生人才学习容器基础.Kuternetes 网络.存储.资源对象.服务发现. ...

  6. "友链"

    欢迎来到我的友链小屋 展示本站所有友情站点,排列不分先后,均匀打乱算法随机渲染的喔!   友链信息 博客名称:麋鹿鲁哟博客网址:https://www.cnblogs.com/miluluyo/博客头 ...

  7. 设计模式之装饰器-AOP

    HelloWorld简单例子如下:此例子好好体会下继承 is a和组合 has a的异同. using System; using System.Runtime.InteropServices; na ...

  8. Java Collection接口下的“ List 集合” 与 “ Set 集合 ”

    Java Collection接口下的" List 集合" 与 " Set 集合 " 每博一文案 一个人最好的底牌,就这两个字: 靠谱,是最高级的聪明. 师父说 ...

  9. go-zero modd开发配置

    目录 go-zero modd开发配置 modd配置 项目打包编排文件 nginx配置文件 各服务中的配置里要写上如下配置 go-zero modd开发配置 modd配置 modd.conf #use ...

  10. python教程8-页面爬虫

    python爬虫常用requests和beautifulSoup这2个第三方模块.需要先进行手动安装. requests负责下载页面数据,beautifulSoup负责解析页面标签. 关于beauti ...