目录

标签: .Net Core

.net core 在 CentOS 中报错 The SSL connection ….

报错信息:The SSL connection could not be established, see inner exception.

看起来是SSL的问题,查了下资料和服务器安装了 OpenSSL 有关,直接拷贝一份证书过去,问题即可解决,执行以下linux命令即可:

cp /etc/pki/tls/cert.pem /usr/local/openssl/

然后重启你的.net core应用即可。

.net core 解决 NGINX 反向代理引起的获取 IP 地址为127.0.0.1

一个项目一直在线上运行了一年多,近期将它从windows平台移植到了linux平台运行,一切顺利。但是….操作过程中唯独增添了一个 NGINX 反向代理,最终导致了获取客户端请求IP不正确的问题,获取结果为:::ffff:127.0.0.1

红色区域表示存在的问题,绿色区域表示我已经修改好的结果

以前以简单的获取NGINX转发的一个Header “X-Real-IP” 来获取的真实IP,今天查资料偶然发现还有个更简单的方式:

在.net core项目中的 Starup.cs 文件中加入以下代码即可:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

原有项目中的代码不做改变:

 string clientIP = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();

以上即可。

参考资料1:https://www.cnblogs.com/niao/p/10305953.html

参考资料2:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.1

Rider 生成项目注释 XML 文件

在 Rider 中没有像这样的 Visual Studio 中,这样的配置:

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DocumentationFile>Office.WebApi.xml</DocumentationFile>
</PropertyGroup>

我们需要手动打开项目 *.csproj (在你的项目根目录) 文件,加入以下代码即可

如图:

后面使用 Rider 就可以编译出 xml 文件了。

.Net Core 访问Oracle的连接字符串

  1. Nuget 搜索安装: Oracle.ManagedDataAccess.Core
  2. 使用以下代码即可连接
// 连接字符串
string cnnStr = "User ID=ITGFS;Password=itsds#oracle;Data Source=\"(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 118.13.222.237)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = ORCL)))\";";

// 连接对象
OracleConnection cnn = new OracleConnection(cnnStr);

// 测试连接
cnn.Open();
cnn.Close();

通过以上代码就可以成功连接到 Oracle 服务器了,实际上 Nuget 搜索安装的包也就是 Oracle 为 .Net Core 提供的专用连接客户端。

运行电脑无需再安装其他的客户端即可运行。

.Net Core 雪花算法(SnowFlake)

概述

分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。

雪花算法的原始版本是 Scala 版,用于生成分布式ID(纯数字,时间顺序),订单编号等。

自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。
GUID:采用无意义字符串,数据量增大时造成访问过慢,且不宜排序。

算法描述

  • 最高位是符号位,始终为0,不可用。
  • 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
  • 10位的机器标识,10位的长度最多支持部署1024个节点。
  • 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。

.Net Core 的雪花算法

源码地址: https://github.com/stulzq/snowflake-net

我一般直接在 .net core 项目中使用 Nuget 获得该组件,进行直接使用,如下图:

Nuget 包管理器中搜索 snowflake 即可
var worker = new IdWorker(1, 1);
long id = worker.NextId();

以上代码, IdWorker 应该以单实例模式运行,否则会出现重复Id。

理论上两个参数:
在同一workid,datacenterid下,1ms 能产生2^12 – 1(4095)个id。
不同workid,datacenterid,1ms能产生2^22 – 1(近420w)个id, 1秒钟产生42亿个id