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:

///

/// 用于处理客户IP地址、端口的HostBuilder中间件

///

public static class WebHostBuilderJexusExtensions

{

///

/// 启用JexusIntegration中间件

///

///

///

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(new JwsSetupFilter());

});

return hostBuilder;

}

}

class JwsSetupFilter : IStartupFilter

{

public Action Configure(Action next)

{

return app =>

{

app.UseMiddleware();

next(app);

};

}

}

class JexusMiddleware

{

readonly RequestDelegate _next;

public JexusMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions 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);

}

}

}

使用方法:

  

 

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。