重点是拿到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. 为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(下)

    简介: 在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答. 在上篇中,主要介绍了 Serverless Devs 多环境功能 ...

  2. 节省 58% IT 成本,调用函数计算超过 30 亿次,石墨文档的 Serverless 实践

    简介:石墨文档使用函数计算搭建文档实时编辑服务,由函数计算的智能调度系统自动分配执行环境,处理多用户同时编写文档带来的峰值负载,函数计算的动态扩缩容能力保障应用的可靠运行. ​ 作者 | 金中茜 对石 ...

  3. IIncrementalGenerator 判断程序集之间可见关系

    本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何判断两个程序集之间是否存在 InternalsVisibleTo 关系 ...

  4. WPF 字体 FontStyle 的 Italic 和 Oblique 的区别

    本文介绍在 WPF 里面的字体属性 FontStyle 的 Italic 和 Oblique 的斜体差别 本文的图片和知识来自: #265 – Specifying Values for FontSt ...

  5. Fixing Missing Windows App Runtime Environment Prompt for Unpackaged WinUI 3 Applications

    This article will tell you how to fix the prompt for a missing Windows App Runtime environment when ...

  6. C#的基于.net framework的Dll模块编程(三) - 编程手把手系列文章

    继续这个系列的博文: 一.设置DLL类库信息: 在接解决方案资源管理器中选择该Dll程序集项目,鼠标右键,选择属性,打开窗口. 点击"程序集信息",打开并编辑该Dll程序集的相关信 ...

  7. 第二讲 Cadence建立工程和元件库

    第二讲 Cadence建立工程和元件库 1.创建工程,设置图纸参数.Design Entry CIS / Orcad Capture CIS / Option /Design Template,可以设 ...

  8. 如何将本地项目第一次同步到gitee远程

    一,Gitee账号的注册/登录 在gitee登录入口输入相关信息进行注册登录https://gitee.com/signup#lang=zh-CN 二,本地安装git客户端并配置用户信息 1.Git ...

  9. 一个完整的可以输出移动端当前省市(地理坐标)的html页面

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 将字节数组输入流拷贝成字节数组输出流,将ByteArrayInputStream转成ByteArrayOutputStream

    /** 将 ByteArrayInputStream 拷贝成 ByteArrayOutputStream * 将 字节数组输入流 拷贝成 字节数组输出流 */ public static ByteAr ...