nuget搜索:Hangfire

安装即可,这里我选择的是 1.7.0-beta1 版本

我是用这个集成到了 mvc api里

这里需要在 Startup 文件里进行如下配置

在配置方法 ConfigureServices 里配置数据库,这是用的是sqlserver数据库初始化

            var hangfireConnStr = _configuration["AppSettings:HangfireConnectionString"];
services.AddHangfire(configuration => configuration.UseSqlServerStorage(hangfireConnStr));

如果数据库是mysql,使用下面语句初始化,需要引用 Hangfire.MySql

            var hangfireMysqlConnStr = _configuration["AppSettings:HangfireMysqlConnectionString"];
services.AddHangfire(configuration => configuration.UseStorage(
new MySqlStorage(
hangfireMysqlConnStr,
new MySqlStorageOptions
{
TransactionIsolationLevel = IsolationLevel.ReadCommitted,
QueuePollInterval = TimeSpan.FromSeconds(),
JobExpirationCheckInterval = TimeSpan.FromHours(),
CountersAggregateInterval = TimeSpan.FromMinutes(),
PrepareSchemaIfNecessary = true,
DashboardJobListLimit = ,
TransactionTimeout = TimeSpan.FromMinutes(),
TablesPrefix = ""
})));

在配置方法 Configure 里需要配置下管理员后台

            app.UseHangfireServer();
app.UseHangfireDashboard();

这样我们就可以通过后台操作管理作业了

地址如下

https://localhost:5001/hangfire

这里可以看到正在跑的作业和执行情况

不过这个后台只能在服务器本机上访问,为了保证安全,无法通过域名访问操作

添加调用代码很简单,在每次系统启动的时候,配置如下,如果没有添加;有了就更新

RecurringJob.AddOrUpdate(() => UpdateMerchIndex(), Cron.MinuteInterval());

这里是指每隔三分钟调用一次 UpdateMerchIndex() 方法。

是不是很简单呢

数据库需要初始化几个表

这里附送数据库初始化建表SQL语句

sqlserver

USE [GEDU_Hangfire]
GO
/****** Object: Table [HangFire].[Job] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Job](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[StateId] [bigint] NULL,
[StateName] [nvarchar](20) NULL,
[InvocationData] [nvarchar](max) NOT NULL,
[Arguments] [nvarchar](max) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_Job] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Hash] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Hash](
[Key] [nvarchar](100) NOT NULL,
[Field] [nvarchar](100) NOT NULL,
[Value] [nvarchar](max) NULL,
[ExpireAt] [datetime2](7) NULL,
CONSTRAINT [PK_HangFire_Hash] PRIMARY KEY CLUSTERED
(
[Key] ASC,
[Field] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Counter] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Counter](
[Key] [nvarchar](100) NOT NULL,
[Value] [int] NOT NULL,
[ExpireAt] [datetime] NULL
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[AggregatedCounter] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[AggregatedCounter](
[Key] [nvarchar](100) NOT NULL,
[Value] [bigint] NOT NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_CounterAggregated] PRIMARY KEY CLUSTERED
(
[Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Set] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Set](
[Key] [nvarchar](100) NOT NULL,
[Score] [float] NOT NULL,
[Value] [nvarchar](256) NOT NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_Set] PRIMARY KEY CLUSTERED
(
[Key] ASC,
[Value] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Server] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Server](
[Id] [nvarchar](100) NOT NULL,
[Data] [nvarchar](max) NULL,
[LastHeartbeat] [datetime] NOT NULL,
CONSTRAINT [PK_HangFire_Server] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[Schema] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[Schema](
[Version] [int] NOT NULL,
CONSTRAINT [PK_HangFire_Schema] PRIMARY KEY CLUSTERED
(
[Version] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[List] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[List](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Key] [nvarchar](100) NOT NULL,
[Value] [nvarchar](max) NULL,
[ExpireAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_List] PRIMARY KEY CLUSTERED
(
[Key] ASC,
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[JobQueue] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[JobQueue](
[Id] [int] IDENTITY(1,1) NOT NULL,
[JobId] [bigint] NOT NULL,
[Queue] [nvarchar](50) NOT NULL,
[FetchedAt] [datetime] NULL,
CONSTRAINT [PK_HangFire_JobQueue] PRIMARY KEY CLUSTERED
(
[Queue] ASC,
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[State] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[State](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[JobId] [bigint] NOT NULL,
[Name] [nvarchar](20) NOT NULL,
[Reason] [nvarchar](100) NULL,
[CreatedAt] [datetime] NOT NULL,
[Data] [nvarchar](max) NULL,
CONSTRAINT [PK_HangFire_State] PRIMARY KEY CLUSTERED
(
[JobId] ASC,
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [HangFire].[JobParameter] Script Date: 01/22/2019 14:16:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [HangFire].[JobParameter](
[JobId] [bigint] NOT NULL,
[Name] [nvarchar](40) NOT NULL,
[Value] [nvarchar](max) NULL,
CONSTRAINT [PK_HangFire_JobParameter] PRIMARY KEY CLUSTERED
(
[JobId] ASC,
[Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: ForeignKey [FK_HangFire_JobParameter_Job] Script Date: 01/22/2019 14:16:29 ******/
ALTER TABLE [HangFire].[JobParameter] WITH CHECK ADD CONSTRAINT [FK_HangFire_JobParameter_Job] FOREIGN KEY([JobId])
REFERENCES [HangFire].[Job] ([Id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [HangFire].[JobParameter] CHECK CONSTRAINT [FK_HangFire_JobParameter_Job]
GO
/****** Object: ForeignKey [FK_HangFire_State_Job] Script Date: 01/22/2019 14:16:29 ******/
ALTER TABLE [HangFire].[State] WITH CHECK ADD CONSTRAINT [FK_HangFire_State_Job] FOREIGN KEY([JobId])
REFERENCES [HangFire].[Job] ([Id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [HangFire].[State] CHECK CONSTRAINT [FK_HangFire_State_Job]
GO

mysql

/*
Navicat Premium Data Transfer Source Server : mysql47.93.198.115

Source Server Type : MySQL

Source Server Version : 50562

Source Host : 47.93.198.115:3306

Source Schema : gedu_hangfire Target Server Type : MySQL

Target Server Version : 50562

File Encoding : 65001 Date: 22/01/2019 14:17:37

*/ SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0; -- ----------------------------

-- Table structure for aggregatedcounter

-- ----------------------------

DROP TABLE IF EXISTS aggregatedcounter;

CREATE TABLE aggregatedcounter (

Id int(11) NOT NULL AUTO_INCREMENT,

</span><span style="color: #0000ff;">Key</span> varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Value int(11) NOT NULL,

ExpireAt datetime NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE,

UNIQUE INDEX IX_CounterAggregated_Key(<span style="color: #0000ff;">Key</span><span style="color: #000000;">) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 3482 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for counter

-- ----------------------------

DROP TABLE IF EXISTS counter;

CREATE TABLE counter (

Id int(11) NOT NULL AUTO_INCREMENT,

</span><span style="color: #0000ff;">Key</span> varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Value int(11) NOT NULL,

ExpireAt datetime NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE,

INDEX IX_Counter_Key(<span style="color: #0000ff;">Key</span><span style="color: #000000;">) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 17107 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for distributedlock

-- ----------------------------

DROP TABLE IF EXISTS distributedlock;

CREATE TABLE distributedlock (

Resource varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

CreatedAt datetime NOT NULL

) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for hash

-- ----------------------------

DROP TABLE IF EXISTS hash;

CREATE TABLE hash (

Id int(11) NOT NULL AUTO_INCREMENT,

</span><span style="color: #0000ff;">Key</span> varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Field varchar(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Value longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,

ExpireAt datetime NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE,

UNIQUE INDEX IX_Hash_Key_Field(<span style="color: #0000ff;">Key</span><span style="color: #000000;">, Field) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 29028 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for job

-- ----------------------------

DROP TABLE IF EXISTS job;

CREATE TABLE job (

Id int(11) NOT NULL AUTO_INCREMENT,

StateId int(11) NULL DEFAULT NULL,

StateName varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

InvocationData longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Arguments longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

CreatedAt datetime NOT NULL,

ExpireAt datetime NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE,

INDEX IX_Job_StateName(StateName) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 5703 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for jobparameter

-- ----------------------------

DROP TABLE IF EXISTS jobparameter;

CREATE TABLE jobparameter (

Id int(11) NOT NULL AUTO_INCREMENT,

JobId int(11) NOT NULL,

Name varchar(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Value longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,

PRIMARY KEY (Id) USING BTREE,

UNIQUE INDEX IX_JobParameter_JobId_Name(JobId, Name) USING BTREE,

INDEX FK_JobParameter_Job(JobId) USING BTREE,

CONSTRAINT FK_JobParameter_Job FOREIGN KEY (JobId) REFERENCES job (Id) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE = InnoDB AUTO_INCREMENT = 17107 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for jobqueue

-- ----------------------------

DROP TABLE IF EXISTS jobqueue;

CREATE TABLE jobqueue (

Id int(11) NOT NULL AUTO_INCREMENT,

JobId int(11) NOT NULL,

Queue varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

FetchedAt datetime NULL DEFAULT NULL,

FetchToken varchar(36) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE,

INDEX IX_JobQueue_QueueAndFetchedAt(Queue, FetchedAt) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 5703 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for jobstate

-- ----------------------------

DROP TABLE IF EXISTS jobstate;

CREATE TABLE jobstate (

Id int(11) NOT NULL AUTO_INCREMENT,

JobId int(11) NOT NULL,

Name varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Reason varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

CreatedAt datetime NOT NULL,

Data longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,

PRIMARY KEY (Id) USING BTREE,

INDEX FK_JobState_Job(JobId) USING BTREE,

CONSTRAINT FK_JobState_Job FOREIGN KEY (JobId) REFERENCES job (Id) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for list

-- ----------------------------

DROP TABLE IF EXISTS list;

CREATE TABLE list (

Id int(11) NOT NULL AUTO_INCREMENT,

</span><span style="color: #0000ff;">Key</span> varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Value longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,

ExpireAt datetime NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for server

-- ----------------------------

DROP TABLE IF EXISTS server;

CREATE TABLE server (

Id varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Data longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

LastHeartbeat datetime NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE

) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for set

-- ----------------------------

DROP TABLE IF EXISTS <span style="color: #0000ff;">set</span><span style="color: #000000;">;

CREATE TABLE <span style="color: #0000ff;">set</span><span style="color: #000000;"> (

Id int(11) NOT NULL AUTO_INCREMENT,

</span><span style="color: #0000ff;">Key</span> varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Value varchar(256) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Score float NOT NULL,

ExpireAt datetime NULL DEFAULT NULL,

PRIMARY KEY (Id) USING BTREE,

UNIQUE INDEX IX_Set_Key_Value(<span style="color: #0000ff;">Key</span><span style="color: #000000;">, Value) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 95 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ----------------------------

-- Table structure for state

-- ----------------------------

DROP TABLE IF EXISTS state;

CREATE TABLE state (

Id int(11) NOT NULL AUTO_INCREMENT,

JobId int(11) NOT NULL,

Name varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,

Reason varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

CreatedAt datetime NOT NULL,

Data longtext CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL,

PRIMARY KEY (Id) USING BTREE,

INDEX FK_HangFire_State_Job(JobId) USING BTREE,

CONSTRAINT FK_HangFire_State_Job FOREIGN KEY (JobId) REFERENCES job (Id) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE = InnoDB AUTO_INCREMENT = 17108 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1;

redis配置(Startup.cs 文件里的 ConfigureServices)

            //注入Hangfire服务 redis
var hangfireRedisConnStr = Configuration["AppSettings:HangfireRedisConnectionString"];
_redis = ConnectionMultiplexer.Connect(hangfireRedisConnStr);
var prefix = Configuration["AppSettings:HangfireRedisPrefixName"];
var option = new RedisStorageOptions
{
Prefix = prefix,
Db = ,
};
if (int.TryParse(Configuration["AppSettings:HangfireRedisDefaultDatabse"], out int dfaultdb))
{
if (dfaultdb >= && dfaultdb <= )
{
option.Db = dfaultdb;
}
}
services.AddHangfire(config => config.UseRedisStorage(_redis, option));

配置文件

{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
"AppSettings": {
"HangfireRedisConnectionString": "127.0.0.1:6379,password=,defaultDatabase=1,ssl=false,writeBuffer=10240",
"HangfireRedisPrefixName": "{hangfire_muniumini}:",
"HangfireRedisDefaultDatabse": "",
"RedisConnectionString": "127.0.0.1:6379,password=,defaultDatabase=1,poolsize=50,ssl=false,writeBuffer=10240",
"UseSwagger": "true"
},
"AllowedHosts": "*"
}

其中AppSetting里的配置说明

HangfireRedisConnectionString(连接字符串,格式参考上面的配置文件)

HangfireRedisPrefixName(redis的字典集名称)

HangfireRedisDefaultDatabse(redis默认数据库序号)

搞定

循序渐进学.Net Core Web Api开发系列【17】:.Net core自动作业之Hangfire的更多相关文章

  1. 循序渐进学.Net Core Web Api开发系列【0】:序言与目录

    一.序言 我大约在2003年时候开始接触到.NET,最初在.NET framework 1.1版本下写过代码,曾经做过WinForm和ASP.NET开发.大约在2010年的时候转型JAVA环境,这么多 ...

  2. 循序渐进学.Net Core Web Api开发系列【16】:应用安全续-加密与解密

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 应用安全除 ...

  3. 循序渐进学.Net Core Web Api开发系列【15】:应用安全

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍W ...

  4. 循序渐进学.Net Core Web Api开发系列【14】:异常处理

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍异 ...

  5. 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...

  6. 循序渐进学.Net Core Web Api开发系列【12】:缓存

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...

  7. 循序渐进学.Net Core Web Api开发系列【11】:依赖注入

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...

  8. 循序渐进学.Net Core Web Api开发系列【10】:使用日志

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇介 ...

  9. 循序渐进学.Net Core Web Api开发系列【9】:常用的数据库操作

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇描述一 ...

  10. 循序渐进学.Net Core Web Api开发系列【8】:访问数据库(基本功能)

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇讨论如 ...

随机推荐

  1. C++中逻辑操作符的重载分析

    1,逻辑运算符的原生语义: 1,操作数只有两种值(true 和 false): 1,C 语言中只有非 0 和 0: 2,逻辑表达式不用完全计算就能确定最终值: 1,短路规则: 3,最终结果只能是 tr ...

  2. 2019 牛客多校第一场 B Integration

    题目链接:https://ac.nowcoder.com/acm/contest/881/B 题目大意 给定 n 个不同的正整数 ai,求$\frac{1}{\pi}\int_{0}^{\infty} ...

  3. Ubuntu18.04+CUDA9.0+cuDNN7.1.3+openface安装总结

    目录 前言 编译工具CMake C++标准库安装 下载OpenFace代码 OpenCV安装 luarocks-Lua 包管理器,提供一个命令行的方式来管理 Lua 包依赖.安装第三方 Lua 包等功 ...

  4. tf.keras 解决plot_model 的配置问题

    https://blog.csdn.net/ha010/article/details/103367311

  5. [HTML知识体系]语义化标签概论

    1.什么是语义化 语义化(Semantic)在HTML5中被大量提起,就是语义化标签向浏览器和开发者展示了它所包裹内容的类型与意思,可是至今我看了好多代码,HTML5新增的语义化标签的使用率还是挺低的 ...

  6. Requests使用

    Requests 简介 Requests库 requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,**Requests 完全满足如今网络的需求 ...

  7. 阿里云ssh免密登陆突然无效

    [root@node03 ~]# ssh-copy-id node02 root@node02's password: sh: .ssh/authorized_keys: Permission den ...

  8. 【和孩子一起学编程】 python笔记--第一天

    [该随笔记录本人在阅读过程写的笔记和一些问题,格式比较随意,不定时更新] 由于该书使用的python版本为2.5,本人使用的为3.6. 第一章: 遇到的第一个问题: 1.3节 输出指令: print ...

  9. JindoFS解析 - 云上大数据高性能数据湖存储方案

    JindoFS背景 计算存储分离是云计算的一种发展趋势,传统的计算存储相互融合的的架构存在一定的问题, 比如在集群扩容的时候存在计算能力和存储能力相互不匹配的问题,用户在某些情况下只需要扩容计算能力或 ...

  10. bzoj 2435

    http://www.lydsy.com/JudgeOnline/problem.php?id=2435 noi 你为什么那么diao, 这种世纪水题刷一道少一道啊... 我原来还以为是两边的联通块大 ...