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:

    /// <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);
            }

        }

    }

使用方法:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码农阿宇

EF Core利用Transaction对数据进行回滚保护

What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用...

3365
来自专栏圣杰的专栏

Abp通用配置模块的设计

下面我将尝试用最简单易懂的方式,对Abp源码中通用配置模块的实现方式加以提炼和精简,尽量继承原作者的设计思想,给大家呈现通用配置模块的“最佳实践”。

2211
来自专栏古时的风筝

ASP.NET-自定义HttpModule与HttpHandler

在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中...

2698
来自专栏calvin

.net core 源码解析-web app是如何启动并接收处理请求

最近.net core 1.1也发布了,蹒跚学步的小孩又长高了一些,园子里大家也都非常积极的在学习,闲来无事,扒拔源码,涨涨见识。

1091
来自专栏木宛城主

Thinking In Design Pattern——探索SOA在企业应用程序中扮演的角色

服务层的定义 Domain Model的设计与实现 IRepository的设计与实现 Document Message模式和Request-Response模...

2015
来自专栏跟着阿笨一起玩NET

无法将类型“System.Collections.Generic.IEnumerable<EmailSystem.Model.TemplateInfo>”隐式转换为“System.Collection

1731
来自专栏王磊的博客

Asp.net中Js、Css文件压缩辅助类

类名:WebCompressUtility.cs 代码如下: /// <summary> /// Js、Css文件压缩辅助类 /// Stone_W /// 2...

3507
来自专栏抠抠空间

Django之admin的使用和源码剖析

1790
来自专栏石奈子的Java之路

原 荐 Java9之HttpClientAP

2272
来自专栏dotnet core相关

WCF 入门 (21)

其实不太了解为什么第21集才讲这个Binding,下面都是一些概念性的东西,不过作为一个入门视频,了解一下也无妨吧。

825

扫码关注云+社区