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);
} } }
使用方法:

asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法的更多相关文章
- Linux配置Tomcat8080端口 远程无法访问解决办法
是因为Linux的防火墙没有开放8080端口 解决办法: /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT #开启8080端口 /sbin/ ...
- Asp.Net Core 发布和部署(Linux + Jexus )
前言 在上篇文章中,主要介绍了 Dotnet Core Run 命令,这篇文章主要是讲解如何在 asp.net core 中对我们的已经完成的程序进行发布和部署. 有关如何使用 Nginx 进行部署, ...
- Asp.Net Core采用MailKit部署到Linux Docker连接邮件服务器报错
前段时间看文章了解到发邮件的SmtpClient已经过时了,微软官方推荐大家用其他解决方案,例如MailKit. https://docs.microsoft.com/zh-cn/dotnet/api ...
- 翻译 - ASP.NET Core 托管和部署 - 在 Linux 上使用 Nginx 托管 ASP.NET Core 网站
翻译自 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-5.0 本文介 ...
- VisualStudioCode创建的asp.net core控制台程序部署到linux
1.asp.net core控制台程序 static void Main(string[] args) { ; ) { Console.WriteLine("Hello World!&quo ...
- ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package
目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...
- 把Asp.Net Core 2.0部署在Linux上,使用Nginx代理服务器,并且用Systemctl命令以服务的方式监听项目
在Linux上部署.net core 2.0程序: 第一步:配置Nginx代理 在/etc/nginx/sites-available/default 中添加 server { listen ; lo ...
- ASP.NET Core托管和部署Linux实操演练手册
一.课程介绍 ASP.NET Core 是一种全新的跨平台开源 .NET 框架,能够在 IIS.Nginx.Apache.Docker 上进行托管或在自己的进程中进行自托管. 作为一个.NET Web ...
- ASP.NET Core Docker jexus nginx部署-CentOS实践版
本文用图文的方式记录了我自己搭建centos+asp.net core + docker + jexus + nginx的整个过程,希望对有同样需求的朋友有一定的参考作用. 本文主要内容如下: cen ...
随机推荐
- [LTR] RankLib.jar 包介绍
一.介绍 RankLib.jar 是一个学习排名(Learning to rank)算法的库,目前已经实现了如下几种算法: MART RankNet RankBoost AdaRank Coordin ...
- [OTA] 系统加密后Recovery是如何读取OTA升级包的
目前很多Android手机采用的FUSE方案,也就是内部SD卡不单独占用一个文件系统而实际上占用的是userdata的空间. 当系统加密后,解密需要VOLD的参于.而在Recovery模式下,是没有V ...
- C#中禁止跨线程直接访问控件
C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...
- 自定义合并列:el-table
objectSpanMethod({ row, column, rowIndex, columnIndex }) {//合并规则 //当前行row.当前列column.当前行号rowIndex.当前列 ...
- 表单元素的required,autocomplete,list用法
required: 当在一个表单元素如:input中加上required属性时,点击提交表单按钮,针对input会弹出一个默认的警告信息,如下图: 代码如下: <form id="my ...
- [20180124]奇怪的SQL*Net message from dblink.txt
[20180124]奇怪的SQL*Net message from dblink.txt --//生产系统出现大量的SQL*Net message from dblink事件,自己分析看看. 1.环境 ...
- [20170705]理解linux su命令.txt
[20170705]理解linux su命令.txt --//我一般在维护时经常使用root用户登录,然后su - oracle 转到其他用户操作--//一般都加入 - 参数.这个已经成了条件反射.. ...
- 基于VMware Workstation在Windows Server 2008 R2上搭建SQL Server 2012高可用性组(AlwaysOn Group)测试环境(二)
接上篇: 以SERVER02为例,将服务器加入域,并安装故障转移群集:(SERVER02-SERVER-04操作相同)
- python第五十一天----线程,Event,队列
进程与线程的区别: 线程==指令集,进程==资源集 (线程集) 1.同一个进程中的线程共享内存空间,进程与进程之间是独立的 2.同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的 ...
- Windows10 内存泄漏
之前遇到win10开机idle一段时间后, 内存噌噌的往上彪, 16G内存基本什么东西没开就90%多.查了网上的一些解决方案: 方法1. 关闭Ndu服务 sc config Ndu start=dis ...