分类:backend

通过 DDNS+显性URL 把内网部署的.NET CORE WEBAPI 项目暴露到公网中

通过本文,你可以把部署在公司/家里服务器/虚拟机上的网站、webapi等站点、服务暴露到公网中,通过显性URL来达到隐藏端口号,直接80/443端口访问。

环境说明

  • .NET CORE WebAPI:本文初衷是因为作者日常 obsidian 中的模板需要一个天气 api,原本是用了 witt 站点提供的服务,但经常抽风,无奈之下准备自己搭建一个,至少可控。
    • 提供天气的服务基于 .NET CORE WEBAPI(.NET 6)
    • 高德天气服务(考虑到会有端口被扫描的风险,个人编写的查询 api 不再对外开放使用。)
  • R86S:
    • PVE7 容器(OS 为 ubuntu 22.04)
    • DDNS 服务(宿主为 istoreOS)
  • 本文域名和解析在腾讯云上(阿里云,花生壳类同)

发布、打包程序

因为内网使用,所以直接 http 即可,为了防止 webapi 自动跳转到 https,建议程序中注释以下部分:

app.UseHttpsRedirection();

打包项目:
直接在 VS 上打包:

如果你要用 PM2 来进行进程守护,那么可以生成的时候,建议用独立部署模式,这样子才能生成不包含 .dll 后缀的文件,以便 PM2 来执行

.NET CORE 下通过 SmtpClient 发送邮件

通过本文你可以实现:使用 .NET SmtpClient 来发送邮件

  • 基础使用:仅含有邮件内容,无附件;
  • 发送含有附件的邮件;
  • 以及抄送等功能。

通过使用 epplus 来动态生成 excel 表单

Summary:

  • 本文旨在说明通过建立本地模型类,通过 EPPlus,来统一生成 excel,模型类见下方代码块。
    • 适合需要动态生成整个 excel 表单的业务。
    • 如果无需动态生成,则可以直接给出物理excel文件硬编码即可。
  • 因涉及到公司业务,这里仅给出和业务无关部分代码。

环境说明:

在 .net core 2.1 和 3.1 中使用 autofac

通过本文你可以获得如何用 autofac 替换 .NET CORE(2.1,3.1) 默认 IOC 容器。

生命周期说明

  • 每个依赖一个实例(Instance Per Dependency) (默认) —-InstancePerDependency()
  • 单一实例(Single Instance) 单例 —-SingleInstance()
  • 每个生命周期作用域一个实例(Instance Per Lifetime Scope)—-InstancePerLifetimeScope()
  • 每个匹配的生命周期作用域一个实例(Instance Per Matching Lifetime Scope)—-InstancePerMatchingLifetimeScope()
  • 每个请求一个实例(Instance Per Request) asp.net web请求—-InstancePerRequest()
  • 每次被拥有一个实例(Instance Per Owned) —-InstancePerOwned()

注册方式

  • 反射
  • 使用实例
  • lambda 表达式

示例代码说明:

在 worker service 中使用 quartz.net

  • 以下示例基于 Quartz.Net 3.0.7(在最新的 3.1-beta2 中已经包含了支持 Microsoft DI 的方法)

在 worker service 中,通过官网示例,会发现 quartz.net 并未生效,究其原因系 DI 未注入导致,原生 quartz.net(3.0.7)是通过 CreateInstance 来创建实例的,本文旨在解决在 Worker Service、Console 中使用 quartz.net 无效的问题。

项目结构如下:

初始化

JobSchedule.cs

用来配置 Job,如果需要更多配置,可以扩展该类。

public class JobSchedule
{
    public JobSchedule(Type jobType, string cronExpression)
    {
        JobType = jobType;
        CronExpression = cronExpression;
    }

    public Type JobType { get; }
    public string CronExpression { get; }
}

基于 .NET CORE 3.1 提供的 worker service 来创建 windows 服务

.NET CORE 3.1 提供了 worker service 这么一个模板,可以方便开发者来创建”windows 服务程序“(同样可发布于 linux)。本篇以 centos 7.6 为发布环境,简要说明如何使用 worker service 来创建服务,并部署发布到 centos 中。

你可以通过以下命令来查看本地安装的 .net core 环境:

dotnet   --version  # 笔者为 3.1.301

你可以通过以下命令来查看是否含有 worker service 模板:

dotnet  new  -l

安装

方式1:命令行形式安装

你可以通过如下命令在当前解决方案中安装:

Elasticsearch.Nest 教程系列 10-4 常用类型:Union Type | 类型合并


ES 中的某些API参数可以接受多个 JSON 数据结构,例如,搜索请求时对 source 过滤可以接受:

  • bool:可以通过布尔值来禁用 _source 检索。
  • string、string[]:可以使用字符串来设定通配符,以此来控制返回 _source 中的哪些部分。
  • object:一个包含 includs 和 excluds 属性的对象,来分别控制需要在 _source 中需要“包含”和“排除”的部分。

在 NEST 中,可以使用 Union<First,Second> 类型。

隐式转换

Union<TFirst,TSecond>具有隐式运算符,可从 TFirst 或 TSecond 的实例转换为Union<TFirst,TSecond> 的实例:

Union<bool, ISourceFilter> sourceFilterFalse = false;

Union<bool, ISourceFilter> sourceFilterInterface = new SourceFilter
{
    Includes = new [] { "foo.*" }
};

Elasticsearch.Nest 教程系列 10-3 常用类型:Date math expressions | 日期数字表达式


在“查询/过滤”的时候支持使用日期类型的数学表达式。表达式以“锚定”日期开始,该日期可以是现在,也可以是以“||”结尾的日期字符串。它后面可以是一个数学表达式,支持 +,- 和 /(四舍五入)。支持的单位有:

  • y (year)
  • M (month)
  • w (week)
  • d (day)
  • h (hour)
  • m (minute)
  • s (second)

ES 中的 Date Math

常规示例

使用 DateMath 提供的静态方法:

Expect("2020-01-23T00:00:00").WhenSerializing(Nest.DateMath.Anchored(new DateTime(2020,01, 23)));

Elasticsearch.Nest 教程系列 10-2 常用类型:Distance Units | 距离单位


在 ES 的 GEO 相关查询中,你会使用到“距离”这个概念,Nest 提供了 Distance 类来帮助你创建“距离”。

通过 Distance 构造函数

var unitComposed = new Distance(25);
var unitComposedWithUnits = new Distance(25, Nest.DistanceUnit.Meters);

也可以使用指定距离单位的字符串,如下:

Expect("25m")
    .WhenSerializing(unitComposed)
    .WhenSerializing(unitComposedWithUnits);

Elasticsearch.Nest 教程系列 10-1 常用类型:Time Units | 时间单位


当你需要在 ES 中指定时间相关的操作时:如超时时间,持续时间,可以使用 Nest 提供的 Time 数据类型。

Time 构造函数

最长用的方法:

var unitString = new Time("2d");
var unitComposed = new Time(2, Nest.TimeUnit.Day);
var unitTimeSpan = new Time(TimeSpan.FromDays(2));
var unitMilliseconds = new Time(1000 * 60 * 60 * 24 * 2);