asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
asp.net core程序部署在centos7(下面的解决方案,其他系统都能使用,这里只是我自己部署在centos7),使用服务器jexus进行部署,AppHost模式。
因为请求是由jexus进行了转发的,所以asp.net zero获取的ip永远都是127.0.0.1.。
解决方案:
使用由Jexus作者宇内流云提供的JwsIntegration替换IISIntegration,它改变默认从请求头获取ip的规则,改为由 “X-Original-For”获取远程ip(经测试 使用"X-Real-IP"也能获取)。
JwsIntegration.cs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | /// <summary> /// 用于处理客户IP地址、端口的HostBuilder中间件 /// </summary> public static class WebHostBuilderJexusExtensions { /// <summary> /// 启用JexusIntegration中间件 /// </summary> /// <param name="hostBuilder"></param> /// <returns></returns> public static IWebHostBuilder UseJexusIntegration( this IWebHostBuilder hostBuilder) { if (hostBuilder == null ) { throw new ArgumentNullException(nameof(hostBuilder)); } // 检查是否已经加载过了 if (hostBuilder.GetSetting(nameof(UseJexusIntegration)) != null ) { return hostBuilder; } // 设置已加载标记,防止重复加载 hostBuilder.UseSetting(nameof(UseJexusIntegration), true .ToString()); // 添加configure处理 hostBuilder.ConfigureServices(services => { services.AddSingleton<IStartupFilter>( new JwsSetupFilter()); }); return hostBuilder; } } class JwsSetupFilter : IStartupFilter { public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next) { return app => { app.UseMiddleware<JexusMiddleware>(); next(app); }; } } class JexusMiddleware { readonly RequestDelegate _next; public JexusMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions<IISOptions> options) { _next = next; } public async Task Invoke(HttpContext httpContext) { var headers = httpContext.Request.Headers; try { if (headers != null && headers.ContainsKey( "X-Original-For" )) { var ipaddAdndPort = headers[ "X-Original-For" ].ToArray()[0]; var dot = ipaddAdndPort.IndexOf( ":" , StringComparison.Ordinal); var ip = ipaddAdndPort; var port = 0; if (dot > 0) { ip = ipaddAdndPort.Substring(0, dot); port = int .Parse(ipaddAdndPort.Substring(dot + 1)); } httpContext.Connection.RemoteIpAddress = System.Net.IPAddress.Parse(ip); if (port != 0) httpContext.Connection.RemotePort = port; } } finally { await _next(httpContext); } } } |
使用方法:
作者:晓晨Master(李志强)
出处:https://www.cnblogs.com/stulzq/p/7344129.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
目前学习.NET Core 最好的教程 .NET Core 官方教程 ASP.NET Core 官方教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律