![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
杨中科.net6学习
文章平均质量分 59
梁萌
认真是一种态度
展开
-
如何构建一个安全的系统
对于一个系统,特别是开放给互联网用户使用的系统来讲,系统的安全性是重要问题。一个系统,如果系统架构差一点儿,最多开发效率低;代码写得差一点儿,最多系统运行速度慢,但是如果系统安全有问题,导致核心业务数据被泄露或者系统被黑客攻击,那就是危及企业存亡的灾难性问题。因此公司的所有人员都必须对系统的安全性提高警惕。原创 2023-05-28 12:58:57 · 353 阅读 · 0 评论 -
.Net Core 数据校验框架使用
为了提高响应速度和界面可用性,一般在客户端都会对用户填写的数据进行校验,这样不需要把数据发送到服务端,用户就知道数据填写错误。但是也不能完全依赖客户端的校验,不仅因为恶意用户可以绕过客户端校验直接向服务器发送请求,而且服务器端也需要对于客户端开发人员对数据校验不到位的地方做兜底工作。所以,服务器端也应该做数据校验。.Net Core 框架本身也内置了数据校验,比如必填校验[Require]等,但校验需要写在类本身上,校验规则和模型类具有较高的耦合性,违背单一职责原则,另一方面,内置的校验规则也不够多。原创 2023-05-22 19:41:21 · 945 阅读 · 0 评论 -
.Net Core 标识框架使用
判断角色是否存在,不存在则创建;判断用户是否存在,不存在则创建;案例1:创建用户和角色。案例3:实现密码的重置。案例2:处理登录请求。原创 2023-05-07 22:53:32 · 192 阅读 · 0 评论 -
.Net Core 标识框架搭建
大部分系统中都需要通过数据库保存用户、角色等信息,并且需要注册、登录、密码重置、角色管理等功能。ASP.Net Core提供了标识(identity)框架,它采用基于角色的访问控制策略,内置了对用户、角色等表的管理及相关接口,从而简化了系统的开发。标识框架还提供了对外部登录(QQ登录、微信登录等)的支持。标识框架使用EF Core对数据库进行操作,标识框架支持几乎所有数据库。下面的示例使用SqlServer数据库。下面从0搭建标识框架,为后面使用框架操作数据做准备工作。原创 2023-05-07 19:16:11 · 288 阅读 · 0 评论 -
.Net Core Action过滤器使用实例(自动启用事务)
使用TransactionScope简化事务代码的编写,TransactionScope是.Net中用来标记一段支持事务的代码的类。EF Core对TransactionScope提供了天然的支持,当一段使用EF Core进行数据库操作的代码放到TransactionScope声明的范围中的时候,这段代码就会自动被标记为“支持事务”。数据库事务有一个非常重要的特性,那就是“原子性”,它保证了我们对数据库的多个操作要么全部成功、要么全部失败,进而帮助我们保证业务数据的正确性。原创 2023-05-03 17:54:21 · 909 阅读 · 0 评论 -
.Net Core Action过滤器使用实例(限流器)
在Action Filter中,如果我们不调用 await next(),就可以终止Action方法的执行了。为了避免客户端恶意发送大量请求消耗服务器资源,实现“一秒钟内同一个IP地址只允许访问一次”如果是频繁访问,那么就不会再执行action方法,使用过滤器起到了限流访问的目的。基于前面对Action Filter的介绍,本节通过实例来说明其用法。Action Filter可以在满足条件的时候终止操作方法的执行。2.将自定义的过滤器进行注入。原创 2022-10-23 16:05:09 · 1121 阅读 · 0 评论 -
.Net Core自定义Action过滤器
通过输出的信息,可以看到程序的执行顺序和开头图片中展示的执行顺序是一样的,先执行过滤器中next()方法前面部分代码,然后执行action方法,最后再分别执行next()方法后面部分的代码。如果有多个action过滤器,那么他们的执行顺序如下所示,每个action过滤器都会被执行两次,分别是在action执行前和执行后各被执行一次。同时可以执行多个自定义的action过滤器,例如,在上面的基础上,增加一个action过滤器。在控制器的方法(action)执行前和执行后,action过滤器都会被执行。原创 2022-10-23 15:29:08 · 1030 阅读 · 0 评论 -
.Net Core自定义异常过滤器
同时可以执行多个自定义的异常过滤器,例如,在上面的基础上,增加异常日志记录的过滤器,发生未经处理的异常时,将异常信息记录到日志文件中。需求:当开发环境出现异常时,返回异常的堆栈信息。1.新建一个WebApi项目,创建一个控制器类,写一个测试action,访问一个不存在的文件。设置运行环境变量值为开发,运行项目,可以看到输出的异常信息。设置运行环境变量值为其他,运行项目,可以看到输出的异常信息。下面以WebApi项目为例,记录异常过滤器的使用方法。当系统中出现未经处理的异常时,异常过滤器就会执行。原创 2022-10-23 12:16:49 · 941 阅读 · 0 评论 -
缓存学习总结4(分布式缓存)
一般的小型系统使用服务器内存缓存就已经可以了。但是对于大型系统,web服务器可能有多台,这时候如果每个web服务器都使用内存缓存,同样还是会造成数据库服务器压力大的问题,因为每台web服务器都会去访问数据库服务器,然后做缓存。针对上面的问题,引入了分布式缓存服务器,把多台web服务器获取到的数据都存在一台缓存服务器上,多台web服务器共享一台缓存服务器,这样可以减少web服务器对数据库的访问数量。分布式缓存服务器说明:1.常用的分布式缓存服务器用Redis、Memcached等。原创 2022-09-04 23:15:52 · 481 阅读 · 0 评论 -
缓存学习总结3(服务器内存缓存)推荐使用
内存缓存就是一种把缓存数据放到应用程序内存中的机制,内存缓存中保存的是一系列的键值对,就像Dictionary类型一样,每个不同的缓存内容有不同的“缓存键”,每个缓存键对应一个“缓存值”。我们可以设置缓存的键值对,也可以根据缓存键取出缓存中保存的缓存值。内存缓存的数据保存在当前运行网站程序的内存中,是和进程相关的。...原创 2022-08-30 21:09:24 · 865 阅读 · 0 评论 -
EFCore-13 多对多关系配置
学生与老师的关系,是一个常见的多对多的关系模型,一个老师有多个学生,一个学生也可能有多个老师。关系模型图如下所示:新建一个控制台应用程序控制台项目结构:项目引用的程序集:Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools1.在实体类中定义关系属性Student.csusing System.Collections.Generic;n...原创 2022-05-29 17:40:40 · 2098 阅读 · 1 评论 -
EFCore-12 一对一关系配置
商品订单和快递单的关系,一般情况下是一对一的,在网上购买商品下一个订单,这个订单会生成一个对应的快递单。如下图所示:新建一个控制台应用程序控制台项目结构:项目引用的程序集:Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools1.在实体类中定义关系属性Order.csusing System;using System.Collecti...原创 2022-05-29 16:38:13 · 1259 阅读 · 0 评论 -
EFCore-11 自引用关系配置
在数据库中表示这样的一个组织关系,可以使用自引用的方式实现,也就是主键和外键在同一张表中。新建一个控制台应用程序控制台项目结构:项目引用的程序集:Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools1.在实体类中定义关系属性OrgUnit.csusing System.Collections.Generic;namesp..原创 2022-05-29 12:27:55 · 1589 阅读 · 6 评论 -
EFCore-10 导航属性
何为导航属性,通俗一些讲就是通过该属性可以访问到另外一个实体。例如评论表中对应的文章属性,文章表中对应的评论属性,这些都是导航属性。明白了什么是导航属性,那么导航属性又分区两类。一类是单向导航属性,一类是双向导航属性。像上面截图所示的那样,在文章实体和评论实体中均可以找到另外一个实体的属性称为双向导航。双向导航的相关配置可以参考前面的文章。下面这个实例中,员工信息和员工请假单信息两个实体之间,就属于单向导航,只可以从员工请假单实体中找到员工信息,但是员工信息中不能够找到请假单的实体。.原创 2022-04-11 18:12:37 · 3079 阅读 · 0 评论 -
EFCore-9 查询优化
本文章记录的内容,衔接上一篇文章的相关代码EFCore-8 一对多关系配置1.仅需要查询需要的字段,提升查询效率查询文章ID为7的文章记录及对应的评论记录EFCore对应的c#代码:Article article = ctx.Articles.Include(a => a.Comments).Single(a => a.Id == 7);EFCore生成的SQL为:SELECT [t].[Id], [t].[Message], [t].[Title], [..原创 2022-04-10 17:03:54 · 1320 阅读 · 0 评论 -
EFCore-8 一对多关系配置
在实际的应用场景中,一对多的关系是比较常见的,以文章和评论为例,一篇文章可能会存在多条评论。下面以代码实例记录一对多形式的关系在EFCore中的使用:控制台项目结构:项目引用的程序集:Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools1.在实体类中定义关系属性文章实体类:using System.Collections.Generic;n..原创 2022-04-09 18:49:29 · 2277 阅读 · 2 评论 -
EFCore-7 查看EFCore转换后的SQL语句
使用EFCore框架,虽然我们写的是c#的语句,其实背后还是转换成了数据库可以执行的SQL。这一转换操作由EFCore框架执行。虽然使用EFCore框架我们更多的精力关注c#即可,但是要想真正了解EFCore的执行情况,还是需要查看框架转换后的SQL语句。这里记录三种查看方式:以下代码示例和操作基于上一节创建的控制台应用程序进行演示。上一节的项目代码地址EFCore-6 反向工程标准日志1.项目中引用控制台打印的程序集(这里只是输出到控制台,所以引用此程序集,如果要以其他方式输出,则原创 2022-04-04 09:03:26 · 2846 阅读 · 0 评论 -
EFCore-6 反向工程
反向工程就是DB First,根据数据库表来反向生成实体类代码,通俗讲就是数据库优先。该方法使用场景为已经有数据库了,数据库里面已经存在一些表,这时候想使用EF Core框架的情况。官方并不推荐使用反向工程,因为这种方法生成的代码,后期维护起来比较麻烦。推荐使用Code First模型,即代码优先。项目操作示例:1.在SqlServer数据库中新建一个库,名字为TestDbHR。在数据库中新建一个表,表名为T_PERSON,字段信息如下图所示。2.新建一个控制台项目,并引用下面两原创 2022-04-03 11:21:22 · 1535 阅读 · 0 评论 -
EFCore-5 Migration操作
migration相关说明:使用迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做“向上迁移”(Up),也可以执行把数据库回退到旧版本的迁移,这个操作叫做“向下迁移”(Down)。 除非有特殊需要,否则不要删除migration文件夹下的代码。包括数据库自动生成的__EFMigrationsHistory表中的数据。如果人为删除可能会引发数据库版本混乱的情况。常用命令说明:1.add-migration XXX根据最新实体,生成数据库更新脚本。2.update-原创 2022-03-21 17:16:39 · 5142 阅读 · 0 评论 -
EFCore-4主键
EFCore支持多种主键生成策略:自动增长、GUID、Hi/Lo算法等。自增主键优点:1.简单。(数据库字段值自动增长,无需人工干预)2.long、int类型主键,默认是自增的(SqlServer数据库)。3.因为是数据库生成的值,所以SaveChangesAsync或者SaveChanges后会自动把主键的值更新到Id属性。缺点:1.数据库迁移以及分布式系统中比较麻烦。2.并发性能差。代码示例一:自增主键设置代码示例二:自增主键值自动更新原创 2022-02-20 17:51:59 · 2599 阅读 · 0 评论 -
EFCore-3FluentAPI
约定配置主要规则:1:表名采用DbContext中对应的DbSet的属性名。2.数据表列的名称采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型。3.数据表列的可空性取决于对应实体类属性的可空性。4.名字为Id的属性为主键,如果主键为short,int 或者long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值。(SqlServer数据库)两种配置方式1.FluentAPI..原创 2022-02-12 18:26:21 · 1115 阅读 · 1 评论 -
EFCore-0文章目录
EFCore-1搭建开发环境EFCore-2数据增删改查原创 2022-01-29 17:05:36 · 421 阅读 · 0 评论 -
EFCore-2数据增删改查
数据插入1.只要操作Books属性,就可以向数据库中增加数据,但是通过c#代码修改Books中的数据只是修改了内存中的数据。对Books做修改后,需要调用DbContext的异步方法SaveChangesAsync()把修改的数据保存到数据库。也有同步保存方法SaveChanges(),但是EFCore更推荐使用异步方法。2.EFCore默认会跟踪(Track)实体类对象以及DbSet的改变。实例代码:using System;using System.Linq;using Sys原创 2022-01-29 16:55:59 · 2410 阅读 · 0 评论 -
EFCore-1搭建开发环境
使用SQL Server数据库作为学习的目标数据库,EFCore使用Code First模式进行项目初始化。项目整体目录如图所示:1.创建实体类using System;namespace EFCoreProject{ /// <summary> /// Book实体类 /// </summary> public class Book { public long Id { get; set; }.原创 2022-01-23 19:13:19 · 850 阅读 · 0 评论 -
.Net 日志系统-Serilog+Exceptionless
Exceptionless可以为ASP.NET、Web API、WebForms、WPF、控制台和MVC应用程序提供实时错误,功能和日志报告。它将收集的信息组织成简单的可操作数据,这将有助于应用程序变得无异常。最重要的是,它是开源的!关于Serilog的用法可以参考文章:.Net 日志系统-Serilog将Serilog和Exceptionless相融合,实现两个功能:1.将日志记录到文本中(Serilog的功能)2.将日志记录到Exceptionless中(本文章只将数据记原创 2022-01-16 18:31:54 · 1548 阅读 · 0 评论 -
.Net 日志系统-Serilog
Serilog 是一个结构化的 C# 日志库。跟log4net和nlog相比,Serilog记录结构化日志更加方便,可以对日志内容自定义格式输出,方便查询和使用。.Net Core程序记录日志到文本文件中,下面用代码来演示如何实现:基于.Net Core WebApi 3.1程序,项目结构如下图:1.NuGet应用程序集:Serilog.AspNetCore2.在Program.cs中创建全局静态实例并启用SerilogProgram.cs完整代码:us原创 2022-01-16 12:19:43 · 4835 阅读 · 0 评论 -
.Net 日志系统-NLog
NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。NLog虽然没有log4net框架的流行程度高,但是它的跨平台性、开源持续维护性、性能等方面优于log4net,具体可以看下面这篇文章:日志框架对比 NLog VS Log4net - fengrui - 博客园.Net Core程序记录日志到文本文件中,下面用代码来演示如何实现:基于.Net Core WebApi 3.1程序,项目结构如下图:1.NuGet应用程.原创 2022-01-15 20:27:31 · 1549 阅读 · 0 评论 -
.Net 日志系统-常用日志框架
程序记录日志是非常重要的事情,下面总结常用的程序记录日志的框架。1.Windows日志这是Windows操作系统自带的日志记录程序,它记录了操作系统中程序所执行的各种操作。这种方式也可以用来记录程序的各种日志,因为它只能在Windows平台使用,并且查看问题并不方便,不能放到文本中查看等等一些弊端。所以并不常用,但是也可满足.Net程序记录日志。.Net 日志系统-Windows日志2.Log4Net这个是非常老牌的日志框架,项目中使用的非常普遍。之前写过几篇文章记录log4ne原创 2022-01-09 19:06:45 · 5171 阅读 · 0 评论 -
.Net 日志系统-Windows日志
Windows日志的查看方法:.Net Core程序记录日志到Windows日志中,下面用代码来演示如何实现:基于.Net Core WebApi 3.1程序1.NuGet应用程序集:Microsoft.Extensions.Logging.EventLog2.依赖注入:在Startup.cs文件的ConfigureServices类中,将EventLog注入到服务中。 //注入EventLog service...原创 2022-01-09 19:03:01 · 1180 阅读 · 0 评论 -
.Net 配置系统-数据库配置提供者
集群部署的项目中,如果每个服务器都使用本地的配置文件,每次修改都要挨个修改,费时费力还容易出错。将配置信息放到数据库的表中,然后通过程序读取配置项,可以单独做一个配置服务器,其他服务器均从配置服务器中读取配置,避免了上述问题。下面用示例展示用法:(数据库使用SqlServer,其他也可以)1.数据库中建表T_Configs,三个字段Id、Name、Value,Id设置为主键并自增长。往表中插入配置数据,支持json格式:程序需要引用的包:Pr.原创 2022-01-09 11:22:01 · 805 阅读 · 0 评论 -
.Net 配置系统-自定义配置提供者
在.NET Framework框架中,新建一个web项目,会默认创建一个web.config的配置文件。可以在里面配置数据库链接字符串,常用配置项等。在项目中,可以通过如下所示的方式读取配置文件中的配置项。string Conn=ConfigurationManager.ConnectionStrings["sqlConnectionString"].ConnectionString;string filepath = ConfigurationManager.AppSettings["Fil原创 2022-01-03 17:19:38 · 697 阅读 · 0 评论 -
.Net 配置系统-其他方式读取配置
使用命令行方式配置引用命令行包:Microsoft.Extensions.Configuration.CommandLine所有引用的包如下所示:如果要使用命令行的形式配置上图的参数,程序运行后,参数传递方式如下图所示:ConfigOptions.exe是项目的名称,后面的name,age等都是要传递的参数。完整代码:Program.csusing Microsoft.Extensions.Configuration;using Microsoft原创 2022-01-03 10:56:37 · 776 阅读 · 0 评论 -
.Net 配置系统-选项方式读取配置
1.推荐使用选项的方式读取,和DI(依赖注入)结合更好,且更好利用“reloadOnChange”机制。2.NuGet安装Microsoft.Extensions.Options、Microsoft.Extensions.Configuration.Binder、Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json。3.读取配置时,DI要声明IOptions<T>、IOptionsMonito原创 2021-12-19 18:13:26 · 555 阅读 · 0 评论 -
.Net 配置系统入门
.Net中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、azure key vault等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖。传统项目一般是从web.config文件中读取配置项的值,配置项一般是xml格式。如下图所示:这种配置方式有一个弊端,当配置项比较复杂时,比如有多个层级,一层层嵌套,看起来非常不直观。这时候用json格式的配置就显得很方便。下面用代码示例展示json格式配置文件的基本用法(代码基于.NetCo原创 2021-11-28 11:34:22 · 1281 阅读 · 0 评论 -
Asp.NetCore3.1 Autofac生命周期
autofac生命周期,一共有六种生命周期。通过下面示例展示每种声明周期的作用范围: public void ConfigureContainer(ContainerBuilder containerBuilder) { #region autofac生命周期 //autofac生命周期 六种生命周期 //1.瞬时生命周期:注册之后,每次获取的服务实例都不一样 containe原创 2021-11-23 19:48:12 · 643 阅读 · 0 评论 -
Asp.NetCore3.1使用Autofac
新建一个基于.Net Core 3.1版本的web项目,新建两个类库项目,分别用于定义接口和接口的实现类。接口定义:接口实现:web项目添加autofac相关程序集的依赖:项目创建完成后,修改相关配置,使autofac替换原有的依赖注入。第一步:CreateHostBuilder方法中添加.UseServiceProviderFactory(new AutofacServiceProviderFactory()),替换默认创建工厂,使用Au...原创 2021-11-21 18:04:53 · 1046 阅读 · 0 评论 -
依赖注入学习总结2
服务的声明周期1.AddTransient类型的声明周期对象声明一个测试的接口和测试用到的类: public interface ITestService { public string Name { get; set; } public void SayHi(); } public class TestServiceImpl1 : ITestService { public string Name原创 2021-11-14 19:35:29 · 673 阅读 · 0 评论 -
依赖注入学习总结1
生活中的“控制反转”:自己发电和用电网的电。自己发电需要自购发电机,自学发电方法,维护发电设备等等。用电网的电只需要付费就可以直接使用。依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的具体实现。依赖注入优点:简化模块的组装过程,降低模块之间的耦合度。控制反转的目的:由原来的“怎样创建XX对象”→“我要XX对象”。控制反转两种实现方式:1.服务定位器(ServiceLocator)原创 2021-11-14 16:59:59 · 680 阅读 · 0 评论 -
Linq学习总结3
linq常用扩展方法定义一个员工信息类 class Employee { public long Id { get; set; } public string Name { get; set; } public int Age { get; set; } public bool Gender { get; set; } public int Salary { get; set; } p原创 2021-11-13 18:08:57 · 507 阅读 · 0 评论 -
Linq学习总结2
linq常用扩展方法定义一个员工信息类 class Employee { public long Id { get; set; } public string Name { get; set; } public int Age { get; set; } public bool Gender { get; set; } public int Salary { get; set; } p原创 2021-11-13 15:22:39 · 583 阅读 · 0 评论