自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 问答 (3)
  • 收藏
  • 关注

原创 EFCore 基于Code First开发的配置

EFCore Code First配置

2023-09-12 12:04:33 203

原创 sqlserver将mdf文件拆分成多个ndf文件

sqlserver2008 mdf文件拆分

2023-01-30 11:05:55 1815 2

原创 sqlserver性能优化之索引最左匹配

sqlserver索引的最左匹配原则

2022-09-02 15:20:54 580

原创 ASP.NET CORE JWT 双token刷新认证

一般情况下我们使用一个token来认证,但是这样的话有一个问题:服务端生成的token的有效期是固定的,默认20分钟。当用户在界面上操作了20分钟以后,这个token就失效了,系统会返回401认证失败,这个情况在我看来是不太合理的。比如用户在执行添加操作,在提交的时候告诉你认证失败了,重新登录后之前添加的内容就要重新写一次,那他肯定要抓狂了,嘴里骂着这是什么烂软件。刷新token的有效期默认是30天,可以自定义。......

2022-08-25 18:16:31 2547 2

原创 VS使用WebDeploy发布网站

webdeploy发布网站

2022-07-13 16:43:49 1500

原创 asp.net core+log4net 写入日志到sqlserver

asp.net core版本:5.0log4net:2.0一般情况下,我比较习惯把日志记录到日志文件中。但这种方式有一个缺点:把项目发布到生产环境后,每次查看日志都需要远程登录到服务器去查看日志文件,有点不太方便,所以我想把日志写入到数据库中。首先我们新建一个asp.net core webapi项目,nuget添加如下包:向日志系统中添加log4net:Host.CreateDefaultBuilder(args) .ConfigureWebH

2022-05-06 17:20:15 1279 2

原创 asp.net core cookie认证

asp.net core版本:5.0客户端:Vue首先我们看一下服务端代码,在startup类的ConfigureServices函数中添加cookie认证:services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();这里没有对cookie做任何的设置,如果你想对cookie做一些设置的做,可以这样写:services.AddAuthentication(Cooki

2022-04-27 15:24:43 641

原创 asp.net core+vue+signalr示例

asp.net core版本:5.0Vue版本:2.5.2本文是入门教程,主要讲解如何利用SignalR从客户端调用服务器的函数,以及从服务器调用客户端的函数。首先看一下服务端代码:添加SignalR服务:public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddSignalR();

2022-04-22 17:04:35 2117

原创 C# 监听WMI事件

C# WMI事件

2021-12-10 16:47:38 1173

原创 ASP.NET CORE JWT认证

ASP.NET CORE版本:.NET 5.0关于JWT的基础知识,请大家上网搜一下,这里主要从代码层面讲解。首先新建一个ASP.NET CORE Web api的空项目,然后新建一个LoginController的api控制器。1、生成Token先看代码: [Route("api/[controller]/[action]")] [ApiController] public class LoginController : Controller {

2021-11-16 10:38:55 1949

原创 ASP.NET CORE配置选项(下篇)

本篇文章使用的配置项对应POCO对象:public class Profile{ public Gender Gender { get; set; } public int Age { get; set; } public ContactInfo ContactInfo { get; set; }}public class ContactInfo{ public string EmailAddress { get; set;

2021-04-18 08:36:40 424

原创 ASP.NET CORE 配置选项(上篇)

以前提起配置,大家都会想到web.config和app.config,而且好像只有这一种方式。但是在ASP.NET CORE中,不仅提供了多元化的配置方式,而且提供了监视功能。我们这里只介绍几种最常用的配置方式,最常见的配置方式应该还是配置文件吧,毕竟使用这种方式修改配置比较方便,不需要重新编译代码。1、将配置定义在appsettings.json文件中配置如下:"format": { "dateTime": { "longDataPattern": "dddd,MMM

2021-04-14 17:45:59 428

原创 深入理解控制反转和依赖注入

之前一直都不太理解这两个概念,这段时间在学习ASP.NET CORE,而ASP.NET CORE是建立在依赖注入框架之上的,所以认真学习了一下。所谓控制反转,其实就是从主动变成被动。以前我们在应用程序中要new一个对象就是很直接地new,这样做其实是违反了程序设计中最重要的一个原则:低耦合。因为在A类中直接引用B类就造成A是直接依赖B的,这样设计出来的程序可扩展性是很差的,这种方式我们称之为主动。那什么是被动呢?被动就是A类如果需要引用B类,不是在A类中直接实例化B类,而是由框架来提供B类的实例

2021-04-13 11:33:04 526

原创 ASP.NET CORE3.1 Identity注册用户后登录失败的解决方案

先看一下失败的情况吧:这是我用自己的邮件注册的一个用户,注册是成功的,数据库中也有这条记录但是大家看到EmailConfirmed字段的值为0,说明这个邮箱并没有经过验证。一般来说,如果是用邮箱进行注册,系统会发送一条验证邮件到你的邮箱。但是这里我没有验证这个邮箱。其实问题就出在了这个字段了,那解决的办法就是让Identity在登录的时候不去验证这个邮箱,代码如下:services.Configure<IdentityOptions>(options =>

2021-03-14 09:10:45 1511 1

原创 ASP.NET CORE 依赖注入服务生命周期

依赖注入服务有3种生命周期:Transient;Scoped;SingletonTransient:即用即建,用后即弃。就是每次获取这个服务的实例时都要创建一个这个服务的实例。Scoped:这种类型的服务实例保存在当前依赖注入容器(IServiceProvider)上,这个后面会有详细的讲解。Singleton:单例。即只保存一个服务实例下面我们来做一个实例的演示,让大家可以更深入地理解这3中生命周期我的测试环境:win10+vs2019+.net core 3.1新建一个.NET

2021-01-18 12:21:01 1914

原创 各进制数之间的互相转换

1、十进制转二进制十进制转二进制有2种方式,第一种是用这个十进制数不断的除以2,直到最后的余数是0或者1,然后将最后一次的结果每次想出的余数从高位到低位排列起来,位数不够的话,高位补0.比如十进制数9:9/2=4余14/2=2余02/2=1余0那么得到的二进制就是:0000 1001。这是提一下,因为除数是2,所以最后一次相除的结果只能是0或者1,等于0的情况是被除数是1或者0,也就是1/2或0/2,其他的十进制数和2相除的最后结果都是1。这种方式只适用于当十进制数比较小的时

2021-01-04 13:39:43 3680

原创 Devexpress Gridview 添加全选列

Devexpress版本:20.2.31、选择Gridview,点击Run Designer,进入Views选项卡2、找到OptionsSelection设置项,设置如图:

2020-12-30 16:28:51 734

原创 sqlserver性能优化建议

1、索引1.1、索引的数量不是越多越好,因为索引多了会影响数据增删改的速度,从而引起死锁,所以索引应该建立在查询频率很高的字段上。1.2、索引列的选择。索引列应该建立在列值重复率低的列上。因为当列值重复率高的时候,索引的查询效率比较低。1.3、对于有聚集索引的表,表数据的存储顺序是按照聚集索引的第一个列升序排列的。这里顺便提一下,当我们不使用order by来查询一个表的数据时,数据是按照ID自增主键升序显示的,这足以证明刚才的论点。1.4、主键和聚集索引的关系。主键不允许有重复值,但聚集索

2020-10-03 15:58:08 1325

原创 C# webpai 路由详解

关于MVC的路由,相信大家都很熟悉了。我们常见的路由是:{controller}/{action}/{id},这个默认的路由能满足我们日常的需要,因为这个路由非常简单,所以这里就不做介绍了,今天我们重点介绍一下Route和RoutePrefix这两个路由特性直接上代码吧:[RoutePrefix("values")] public class ValuesController : ApiController { [HttpGet] [Route("G

2020-09-19 14:24:53 2241 1

原创 SignalR实现从服务端主动发送数据到客户端

场景:服务端在后台开启了一个HttpListener的监听器来监听第三方设备通过http协议发送过来的设备实时数据,当服务端接收到设备的实时数据后,通过SignalR技术将数据发送到前端我们先看服务端添加SignalR组件的步骤吧。首先我们要从NuGet上查找SignalR组件,安装以下两个组件:在当前项目上右击,添加新建项,找到OWIN Startup类,点击添加。代码如下:public void Configuration(IAppBuilder app) {.

2020-08-21 17:57:51 2893

原创 C# Task.Delay和Thread.Sleep的区别

我们大家都知道Task.Delay是异步等待,Thread.Sleep是同步等待,那到底同步等待和异步等待有什么区别呢?下面我们用例子来分析一下,新建一个控制台应用程序,代码如下:static async Task Main(string[] args) { for (int i = 0; i < 5; i++) { var s = await MyTask();

2020-07-29 11:17:07 2199

原创 ASP.NET CORE在类库项目中读取配置文件

直接上代码吧:public static string ReadConnectString(string connectName) { var config = new ConfigurationBuilder().Add(new JsonConfigurationSource() { Path = "appsettings.json", Optional = true

2020-07-24 09:15:52 470

原创 EF CORE在ASP.NET CORE项目中基于数据库优先模式生成实体模型

测试环境:1、vs2019社区版2、EF CORE 3.1.63、ASP.NET CORE 3.1首先我们使用VS新建一个ASP.NET CORE的项目,然后新建一个.Net Core的类库。因为在大多数情况下,我们都需要把对数据库的操作放在一个类库中,避免所有的业务逻辑都放在web项目中。这里有一点要注意一下,就是这个类库必须是.NET Core的类库,不能是.NET Standard的类库,不然的话会报下面这个错误:类库建好以后,把这个类库设置为启动项目。然后使用NuGet包添.

2020-07-24 08:52:09 945

原创 .NET Standard详解

.NET Standard是一套协议规范,不像.NET Framework,后者是一个完整的技术框架,而前者只是定义了一套规范,遵守这套规范的.NET Standard类库可以被不同.NET框架引用,比如.NET Core项目和.NET Framework项目都可以引用这个类库。Standard这个单词就是标准、规范的意思,.NET Standard旨在建立一套标准,解决不同.NET框架之间的兼容性问题。关于.NET Standard的概念以及版本支持的知识,请大家参考MSDN的介绍:https:/

2020-06-30 08:05:48 6547

原创 .NET类型转移

我们大家都知道,一般框架都能够实现向下兼容,那具体这个兼容是怎么实现的呢?首先我们使用.Net Framework 3.5 创建一个控制台程序, 代码如下:static void Main(string[] args) { Console.WriteLine(typeof(string).Assembly.FullName); Console.WriteLine(typeof(Func<>).Assembly.FullNa

2020-06-28 10:51:20 231

原创 github访问慢的解决办法

国内github访问慢的原因主要是DNS域名解析的问题。解决办法:1、首先访问网站https://www.ipaddress.com/ 来获取当前github最新的ip地址。在搜索框中输入:github.com,结果如下:这个IP地址就是github网站的IP地址。2、打开路径:C:\Windows\System32\drivers\etc,找到hosts文件。这个文件默认是没...

2020-06-24 14:02:02 628

原创 .NET跨平台原理(上篇)

1、.NET Framework层次结构FCL(Framework Class Library) BCL(Basic Class Library) CLR(Common Language Runtime) FCL:这是一个为开发人员提供的API类库,比如我们经常使用的框架:Windows Forms、ASP.NET、WPF、WCF等。这一层是直接面向开发人员的。BCL:这是处于底层的类库,提供与操作系统层面交互的代码,如:IO、线程管理CLR:它为程序提供一个托管的执行环境,是.NE

2020-06-24 13:56:54 1444

原创 sqlserver 使用脚本创建跟踪文件

测试环境:sqlserver 2019什么是跟踪文件?跟踪文件就是能记录sqlserver 执行的每一条语句的文件。通过这个文件,我们可以看到每一条语句执行时所耗费的资源,比如:cpu时间、查询持续时间(Duration)、逻辑读取次数、查询开始时间、查询结束时间等。SQL Server Profiler可以实现这个功能,但是它是一个UI界面,只能查看,不能保存到文件(其实可以保存到文件,不过操作比较麻烦,不如SQL脚本方便)。而且这个UI界面在打开的时候对查询性能有很大的影响,所以不适合在生产环境

2020-06-20 17:43:18 533

原创 EF Code First 数据库迁移命令

Enable-Migrations [-ContextTypeName <String>] [-EnableAutomaticMigrations] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConnectionStringName <String>] [-Force] [&lt...

2020-03-26 07:40:32 276

原创 WPF学习笔记:Binding的数据转换

前面我们讲解的数据绑定都是非常简单的数据类型,基本上都是int或者string,都可以很容易的显示在界面上。但是想象一个这样的场景:我们定义了一个枚举,这个枚举有2个枚举值,checked和unchecked。界面上有一个checkbox,当值为checked时,复选框被选中。因为checkbox是无法识别枚举项的,所以这里需要一个数据的转换,把枚举项转换成bool值。下面我们看一个例子:...

2020-02-27 20:51:44 703

原创 WPF学习笔记:Binding对数据的校验

在我们给控件的某个属性赋值或者当控件的某个属性值改变时,我们可能会需要检查这个值是不是在规定的范围内。如果这个值不在规定的范围内,我们需要给出提示。WPF中实现这个功能的类是ValidationRule。先看一个例子吧:xaml代码:<Window x:Class="BindValidationRule.MainWindow" xmlns="http://schem...

2020-02-27 20:15:14 458

原创 WPF学习笔记:添加二进制资源

在程序开发中,我们经常要引用外部的图片、视频等文件。这些文件如果不被编译进可执行文件里(exe或dll),则可能会丢失。下面我们来看一下怎么把这些外部资源文件编译进我们的程序中。我们以图片为例,在Image控件中显示一张外部的图片。首先在当前项目的顶部右击=》添加=》新建文件夹,我的项目目录如下:文件名可以随意命名,我建了Resource文件夹,下面新建了一个Icon文件夹,用来放...

2020-02-20 19:49:07 198

原创 WPF学习笔记:Binding不同类型的源

1、集合对象WPF列表式控件派生自ItemsControl类,自然也就继承了ItemsSource这个属性。ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都实现了这个接口,例如:List<T>)。每个ItemsControl的派生类都具有自己对应的条目容器。例如ListBox的条目容器就是ListBoxItem。It...

2020-02-17 20:09:45 1099

原创 WPF学习笔记:Binding基础

我们知道WPF最重要的一个特性是数据驱动UI,Binding就是实现这个特性的桥梁,这个类把数据和界面控件关联起来。而且它还支持双向通信。当数据改变时,界面显示会自动改变;当界面内容改变时,后台的数据也会自动改变。当然这个双向通信是可以设置的。1、Binding基础binding源和目标。刚才说binding是一座桥梁,那源和目标就是桥梁的两端。一般来说,源就是数据,目标就是UI,但也可以...

2020-02-16 12:27:47 377

原创 WPF学习笔记:x名称空间详解

字母x其实是XML的首字母,x命名空间对应的就是这一条语句:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml",它包含的类均与解析XAML语言相关,主要分为3类:Attribute、标记扩展、指令元素1、Attribute1.1、x:Class这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指...

2020-02-06 10:23:41 1892

原创 WPF学习笔记:XAML入门

1、什么是XAMLXAML是WPF技术中专门用于设计UI的语言,它在桌面开发及富媒体网络程序的开发中扮演了HTML+CSS+JAVASCRIPT的角色,成为设计师和程序员之间沟通的桥梁。它帮助开发团队真正实现了UI与逻辑的分离。2、解析最简单的XAML代码我们新建一个WPF项目,然后打开UI设计界面,代码如下:<Window x:Class="WpfApp1.MainWin...

2020-02-04 10:18:04 535

原创 c# task异常处理

我们这里说的task异常处理其实指的是异步方法的异常,现在处理异步我们基本上用的都是task,所以这里只讨论了task的异常处理。在没有出现task之前,我们一般用BeginInvoke方法开始异步,然后在这个方法里面定义一个回调函数,在这个回调函数里处理异常,由于这个方法已经过时,这里就不做介绍了。异常处理一般包括两种:1、将异常信息写入到错误日志。2、抛出异常。这里我们讨论第二种情况。因为...

2020-01-17 20:10:32 4840

原创 C# 任务和线程的区别

任务即Task类,线程即Thread类。使用任务执行并行和并发代码是微软强烈推荐的,因为任务比线程的抽象级别更高,而且任务是并行的。关于并发和并行的区别,这里就不做介绍了,网上有很多资料。1、线程池创建任务的基本原理是使用线程池,也就是说任务最终也是要交给线程去执行的。但是微软优化了任务的线程池,使线程的控制更加精准和高效。对于需要频繁创建线程的程序来说,使用线程池无疑是最好的选择。因...

2020-01-15 11:23:58 2184

原创 职场感悟

正式进入职场是在2012年3月份左右。当时第一份工作做的是软件测试,测试ERP之类软件的功能,非常简单,没有什么技术含量。当时的月薪是1800块,才做了1个月左右就被开除了,因为老板没有看到我的工作成果,觉得我没有价值。但是实际上我测出了那个软件的很多BUG,只是我没有告诉老板,只和软件的开发人员说了。老板开除我的时候,有一个开发人员告诉老板说我测出了软件的很多BUG,这时老板意识到了我的价值,打...

2020-01-06 17:24:55 286

原创 c# 调试技巧

大家都知道,打断点是最为大家所熟知的调试技巧,但是除了打断点,还有哪些调试的技巧呢?System.Diagnostics;这个命令空间里有很多可供调试的类库。Diagnostics这个单词的意思是诊断,在软件的世界里就是诊断程序存在的问题,即调试。下面为大家介绍这个类库里几个非常实用的方法,这几个方法只在DEBUG模式下被编译,而在Release模式下是不会被编译。1、Debug.Writ...

2020-01-06 10:34:48 1382

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除