.NET
文章平均质量分 64
以实战为线索,逐步深入.net开发各个环节,掌握后端常用性能体验优化思路,打造完整后端工作流,提升工程化编码能力和思维能力。
后端Q
公众号 @ 后端Q
展开
-
十大.NET Core性能优化技巧
通过这些工具,可以定位到代码中的热点和性能问题,从而进行有针对性的优化。在.NET Core中,可以通过使用ORM框架(如Entity Framework Core)来简化数据库操作,并通过合理的索引、查询优化等手段提高数据库访问性能。在.NET Core中,可以使用内存缓存(MemoryCache)或分布式缓存(如Redis)来存储频繁访问的数据,减少不必要的数据库或网络请求。在性能优化时,应遵循“先让它工作,再让它快”的原则,先确保代码的正确性和功能性,再进行性能调优。性能优化是一个持续不断的过程。原创 2024-02-14 23:28:35 · 525 阅读 · 0 评论 -
在.NET中,string类型可以作为lock的锁对象吗?
在.NET中,所有的对象都继承自System.Object,而System.Object类有一个名为Monitor的静态类,该类提供了Enter, Exit, 和 TryEnter等方法,这些方法用于实现lock语句的底层机制。相反,你应该使用专门的、私有的对象实例来作为锁对象,以确保并发控制的安全性和可维护性。通过这种方式,你可以确保锁的使用是明确的,并且只在需要时发生。潜在的冲突:如果你的应用程序中的不同部分都使用相同的string常量作为锁对象,那么这些部分可能会意外地彼此阻塞,导致死锁或性能问题。原创 2024-02-14 23:26:34 · 328 阅读 · 0 评论 -
超越Swagger和Postman:使用Visual Studio的.http文件轻松调试Web API
与传统的Swagger和Postman等工具相比,.http文件具有更高的集成度、更简便的操作和更强的直观性。此外,对于更复杂的API测试场景,可以考虑结合使用其他测试框架和工具,如xUnit、NUnit等,以实现更全面的测试覆盖。创建.http文件:在Visual Studio中,选择“文件”>“新建”>“文件”,然后选择“HTTP Request”来创建一个新的.http文件。编写HTTP请求:在.http文件中,使用简单的语法编写HTTP请求,包括请求方法、URL、请求头、请求体等。原创 2024-02-14 23:25:18 · 607 阅读 · 0 评论 -
最全面透彻的RabbitMQ指南
概念RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。AMQPA原创 2022-05-19 22:47:26 · 372 阅读 · 0 评论 -
.Net Core中利用反射实现批量依赖注入
在.net core中使用依赖注入是很常见的,最常见的我们会使用以下三种services.AddScoped<TestIBLL, TestBLL>();services.AddSingleton<TestIBLL, TestBLL>();services.AddTransient<TestIBLL, TestBLL>();当我们的业务层内容不多的时候这样写没有什么问题,但是加入有100个BLL呢,那样一个一个加会很麻烦,每加一个就要原创 2022-02-27 11:14:21 · 1569 阅读 · 1 评论 -
ASP.NET Core 配置跨域(CORS)
在 Startup类,ConfigureServices方法里,添加如下代码: services.AddCors(options => options.AddPolicy("cors", p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); services.Configure<ApiBehaviorOptions>(options =>原创 2022-02-27 11:12:24 · 945 阅读 · 0 评论 -
一篇文章了解Liquid模版引擎
背景平常比如开发个代码生成器一般是定一个模板,然后里面很多变量,根据数据生成文件。这时候模版引擎就派上了用场。下面我们来介绍下Liquid。什么是Liquid 呢,就像java、c#等编程语言一样,Liquid也是一种独立的语言,没什么大差别,基本功能都有。动态生成文件,可以输出变量,操作数组等,这些都能达到。官方的介绍Liquid 是一门开源的模板语言,由 Shopify 创造并用 Ruby 实现。它是 Shopify 主题的骨骼,并且被用于加载店铺系统的动态内容。...原创 2022-02-13 10:57:45 · 1086 阅读 · 0 评论 -
.Net Core 读取文件时中文乱码问题的解决方法
背景今天在使用core web api上传txt文档的时候本来很顺利的,但是一测试发现读取的中文内容是乱码的,很是纳闷。出于经验,立马把代码的Encoding.Default改成 Encoding.uft8, 发现还是不行。后面索性把上传的文件另存为下,特地选择带有bom的utf8选项。但是发现还是乱码。郁闷。问题于是在本能的百度下,发现方法一大堆,但是没有一个可以解决问题的。无意中,发现了链接,找到了官网 如下https://do...原创 2022-02-12 12:01:13 · 1665 阅读 · 0 评论 -
redis缓存设计要点随谈
在高并发系统中,缓存是必不可少的一部分。没有缓存对系统的加速和阻挡大量的请求直接落到系统的数据库,系统是很难撑住高并发的冲击。所以缓存设计是系统很关键的一环。1、缓存更新缓存的数据一般都是有有效期的,过了一段时间之后就会失效,再次访问时需要重新加载。缓存的失效是为了保证与数据源真实的数据保证一致性和缓存空间的有效利用性。缓存更新一般分为3种1、空间有限,当达到最大值时 根据系统的设置规则直接过期的,比如最少使用、随机等一些过期策略。2、缓存...原创 2022-02-05 11:37:46 · 626 阅读 · 0 评论 -
Task+ConcurrentQueue多线程编程
队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。 ConcurrentQueue<T>队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构。Task是在ThreadPool的基础上推出的,我们知道了ThreadPool的弊端:我们不能控制线程池中线程...原创 2022-02-03 11:23:58 · 745 阅读 · 0 评论 -
.NET网站国际化策略
我所在的公司是做SAAS软件,用户群体是面向全球的,因此对应业务系统国际化就是顺理成章的事情。其实国际化重点在于多语言支持,本文就从这方面入手。多语言如上解决方案截图,BQoolCommon.Resource是多语言资源工程,下面来看看具体怎么实现:2.1、定义多语言资源文件以支持中(繁体、简体)英文为例,定义如下图资源文件资源文件中定义的资源配置项如下:生成对应的键值对属性 /// <summary> //...原创 2022-02-02 16:56:28 · 394 阅读 · 0 评论 -
Filter+Redis解决项目之间调用的幂等性
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同在项目远程调用中,如果接口调用失败或者是超时,客户端都会采用重试请求,但是在客户端重试的过程中都会导致服务器服务处理出现【重复消费】;一般情况下,接口产生重复消费的原因有以下2种:1、表单重复提交;2、调用接口过程中失败产生重试;这时候接口调用就会产生了一个叫做幂等性的问题对于查询和删除数据的场景都有天然的...原创 2022-02-01 00:36:23 · 643 阅读 · 0 评论 -
自动化部署:在Windows平台安装Jenkins
在软件开发中经常会提到持续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD)。其中Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。是CICD的一大利器。Jenkins可以做什么它的流水线操作正如其名,将机械的工作流程提炼出来,重复执行,可以定义成定时操作,可以定义触发条件,可以填写参数,可以写入控制语句。代替我们完成:1、拉原创 2022-01-23 23:14:48 · 2014 阅读 · 2 评论 -
解决new Thread().Start导致高并发CPU 100%的问题
以下文章来源于UP技术控,作者conanUP技术控.江东子弟多才俊,卷土重来未可知。——唐·杜牧背景之前接手一个项目的时候,发现到处是newThread(()=>{//dosomething}).Start();这么做的目的,无非是为了减少页面等待时间提高用户体验,把一些浪费时间的操作放到新线程中在后台运行。问题但是这样带来的问题是大量的创建线程,非常影响项目的性能,尤其是在一些大并发量访问的时候,经常导致后果是cpu 100%。当然,如果你的项...原创 2022-01-20 19:35:28 · 1297 阅读 · 0 评论 -
到底该不该使用存储过程
百度百科对存储过程的定义存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升;那么关于开发当中是否使用存储过程,一直以来都有很多争论;在《阿里巴巴java编码规范》有这样一条关于这个,我个人在互联网行业是赞同的;首先,确原创 2022-01-03 20:42:42 · 409 阅读 · 0 评论 -
使用工作单元UnitOfWork实现事务
概述工作单元模式有如下几个特性:1、使用同一上下文2、跟踪实体的状态3、保障事务一致性。工作单元用来维护一个由已经被业务事物修改的业务对象组成的列表。Unit Of Work模式负责协调这些修改的持久化工作以及所有标记的并发问题。在数据访问层中采用Unit Of Work模式带来的好处是能够确保数据完整性。如果在持久化一系列业务对象(他们属于同一个事物)的过程中出现问题,那么应该将所有的修改回滚,以确保数据始终处于有效状态。主要代码实现1、定义接口,实现构造函数publicUnit...原创 2022-01-03 20:41:21 · 725 阅读 · 0 评论 -
NLog-ASP.NET Core 5入门
1、创建一个新的ASP.NET Core项目在Visual Studio 2019中。需要版本16.8+2、手动或使用NuGet在csproj中添加依赖项安装最新版本: NLog.Web.AspNetCore4.9+ 如有可能,更新NLog软件包 在csproj中: <ItemGroup> <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" /> <.原创 2021-12-31 00:51:07 · 245 阅读 · 0 评论 -
巧用ActionFilter的AOP特性,为返回的数据增加返回码和消息
背景对于处理接口返回值统一加密,过滤,特定值统一处理,统一返回等多种需求,net的拦截器前置拦截比较常用,例如:登录校验,参数格式校验等等。接下来介绍filter。filter过滤器实现filter的ActionFilterAttribute可以做一定的处理,通过对OnActionExecuted的执行控制,来实现很多场景。ActionFilterAttribute类是C# ASP.net MVC中的过滤类,跟JAVA的Filter效果类似,但是Filter是接口。ActionFilterAtt原创 2021-12-26 10:22:17 · 720 阅读 · 0 评论 -
如何在C#中捕获内存不足异常?
当CLR未能分配所需的足够内存时,将发生System.OutOfMemoryException。System.OutOfMemoryException继承自System.SystemException类。OutOfMemoryException使用COR_E_OUTOFMEMORY值为 0x8007000E的 HRESULT 。有关OutOfMemoryException实例的初始属性值列表,请参阅OutOfMemoryException构造函数。一个OutOfMemoryException异常异常主要原创 2021-12-26 10:20:13 · 2141 阅读 · 0 评论 -
C# Jpush 极光推送消息推送
简介消息推送(Push)指运营人员通过自己的产品或第三方工具对用户移动设备进行的主动消息推送。用户可以在移动设备锁定屏幕和通知栏看到push消息通知,通知栏点击可唤起APP并去往相应页面。我们平时在锁屏上看到的微信消息等等都属于APP消息推送行列。使用极光推送, C# 服务端推送到 Demo App,Android 手机收到推送,整理为十个步骤,使用十分钟左右,完成从注册账号到 Android 手机上的 Demo App 收到推送。步骤1.注册极光账号 注册页面:https://www.jigu原创 2021-12-25 10:33:49 · 2433 阅读 · 0 评论 -
在 ASP.NET Core 中使用托管服务实现后台任务
在 ASP.NET Core 中,后台任务作为托管服务实现。托管服务是一个类,具有实现 IHostedService 接口的后台任务逻辑。ASP.NET Core 辅助角色服务模板可作为编写长期服务应用的起点。通过辅助角色服务模板创建的应用将在其项目文件中指定 Worker SDK:<ProjectSdk="Microsoft.NET.Sdk.Worker">要使用该模板作为编写托管服务应用的基础:创建新项目。选择“辅助角色服务”。选择“下一步”。在“项目名称”字段.原创 2021-12-24 15:40:00 · 987 阅读 · 0 评论 -
C#的dapper使用
Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。Dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快。使用ORM的好处是增、删、改很快,不用自己写sql,因为这都是重复技术含量低的工作,还有就是程序中大量的从数据库中读数据然后创建model,并为model字段赋值。这些ORM都可以轻松给你搞定。ORM给我们开发带来便利时,性能也是一个让我们不得不考虑的问题。一般原创 2021-12-18 21:31:16 · 1012 阅读 · 0 评论 -
对象到对象映射-AutoMapper
AutoMapper 是一个对象-对象映射器,可以将一个对象映射到另一个对象。用来解决一个看似复杂的问题,这种类型的代码编写起来相当枯燥乏味,官网地址:http://automapper.org/官方文档:https://docs.automapper.org/en/latest/入门AutoMapper支持使用静态服务位置构造“自定义值解析器”,“自定义类型转换器”和“值转换器”的功能: var configuration = new MapperCo原创 2021-12-17 21:42:51 · 312 阅读 · 0 评论 -
C# 使用阿里云发送短信
最近有个项目,短信服务使用的是阿里云的,想要使用阿里云平台的短信服务,首先要注册一个阿里云账号,由于发送短信消息需要用到短信签名、短信模板ID(已添加并通过审核)1、注册阿里云账号(地址:https://www.aliyun.com/)2、添加短信签名和短信模板3、短信服务相关引用dll添加引用引用——>管理NuGet程序包——>搜索Aliyun.Acs.Core——>安装usingAliyun.Acs.Core;usingAliyun.Acs.Core....原创 2021-12-15 22:13:23 · 1096 阅读 · 0 评论 -
Jira8.5 for Windows 安装&使用
1 安装https://confluence.atlassian.com/adminjiraserver/installing-jira-applications-on-windows-938846835.html1.1 配置数据库https://confluence.atlassian.com/adminjiraserver/connecting-jira-applications-to-sql-server-2012-938846858.html本次安装使用数据库 SQL Server20.原创 2021-12-11 02:55:09 · 1838 阅读 · 0 评论 -
如何在控制台应用程序中使用分布式日志Exceptionless
Exceptionless 在所有类型的 .NET 应用程序中运行。让我们来看看如何在控制台应用程序中开始使用 Exceptionless。要使用 Exceptionless,请像这样添加 Exceptionless 命名空间:usingExceptionless;完成后,定义 Exceptionless 客户端:varclient=newExceptionlessClient("YOURAPIKEY");现在可以像这样向 Exceptionless 发送事件:...原创 2021-12-05 10:11:07 · 858 阅读 · 0 评论 -
ASP.NET Core Filter如何支持依赖注入
概述通过使用 ASP.NET Core 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码。内置筛选器处理任务,例如:授权(防止用户访问未获授权的资源)。响应缓存(对请求管道进行短路出路,以便返回缓存的响应)。可以创建自定义筛选器,用于处理横切关注点。横切关注点的示例包括错误处理、缓存、配置、授权和日志记录。筛选器可以避免复制代码。例如,错误处理异常筛选器可以合并错误处理。ASP.NET Core Filter如何支持依赖注入?可以通过全局注册,支持依赖注入。通过TypeFilt...原创 2021-03-26 09:38:25 · 279 阅读 · 0 评论 -
windows服务autofac注入quartz任务
概述Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使应用在规模及复杂性增长的情况下依然可以轻易地修改 . 它的实现方式是将常规的.net类当做组件处理。我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了。下面我们来看下在windows服务quartz任务下,如何使用注入信息autofac,以实现和web其他项目使用公共类库。主要实现1、Pro...原创 2021-03-25 09:16:18 · 357 阅读 · 0 评论 -
文件存储到amazon S3
概述由于云技术的日益成熟,越来越多的公司存储文件时会用到云技术,而亚马逊就提供了一个日益成熟的云环境的服务器群方便存储的文件。Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用 S3 来存储并保护各种用例(如数据湖、网站、移动应用程序、备份和还原、存档、企业应用程序、IoT 设备和大数据分析)的数据,容量不限。Amazon S3 提供了易于使用的管理功能,因此原创 2021-03-24 09:15:45 · 319 阅读 · 0 评论 -
windows下Redis的安装
概述Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。Redis提供诸如字符串、哈希、列表、集合、带范围查询的排序集合、位图、超日志、地理空间索引和流等数据结构。Redis具有内置的复制、Lua脚本、LRU逐出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。下载地址:https://github.com/tporadowski/redis/releases。Redis 支持 32 位和 64 位。原创 2021-03-23 09:33:24 · 179 阅读 · 0 评论 -
一日一技:ASP.NET Core 判断请求是否为Ajax请求
概述在写后台程序时,有时候需要知道客户端发送的是普通的请求,还是ajax 请求,最近在做项目的时候,有些地方需要判断当前的请求是不是ajax。特地找了下发现,jQuery 发出 ajax 请求时,会在请求头部添加一个名为 X-Requested-With 的信息,信息内容为:XMLHttpRequest。Ajax请求的request headers里都会有一个key为x-requested-with,值为XMLHttpRequest的header,所以我们就可以使用这个特性进行判断。判断是.原创 2021-03-22 09:15:25 · 345 阅读 · 0 评论 -
使用GZipStream实现压缩和解压缩
概述之前做项目,涉及到存入到数据库或者http传输的数据量比较大,这个时候,就需要考虑在存入数据库或者发送传输之前,将数据压缩下,当从数据库中取出时,再解压还原数据。特地找了下发现有GZipStream可以实现这个功能。此类表示gzip数据格式,该格式使用行业标准算法进行无损文件压缩和解压缩。该格式包括用于检测数据损坏的循环冗余校验值。gzip数据格式使用与DeflateStream类相同的算法,但可以扩展为使用其他压缩格式。该格式很容易以专利未涵盖的方式实施。从.NET Framework 4.5开始原创 2021-03-21 18:55:43 · 340 阅读 · 2 评论 -
爬取异步请求(XHR/JS)数据方法
概述之前在做爬虫的时候,比如在爬取到https://www.1688.com/?spm=a261p.8650866.0.0.2dfa36c3tjLrCQ网页的时候,发现很多内容明明在浏览器看得见,但是请求下来的内容却没有,于是打开F12查看Network发现,如下: 从这里我们就可以清楚的在xhr返回的header里面看到异步请求的url,这里我们直接访问该url(或者在preview里面可以看到返回的数据)可以看到返回的数据就是需要数据,也就是我们要爬的数据。接下来就是进行url格式分析,一般都会有原创 2021-03-19 09:11:36 · 2002 阅读 · 0 评论 -
你不知道C#只带有 get 访问器的属性是只读属性?
问题窥探之前有个哥们在使用Newtonsoft.Json反序列化的时候,发现明明有数据,但是就是序列化不出来数据到实体里面。咋一看,确实没什么问题啊,字符串的数据是存在的。那么问题出在哪里呢。解决思路1、我让他把字符串复制出来,使用在线工具解析下,和实体对应的名称核对看下是否有出入。发现确实没问题。2、于是我让他把实体文件发我下。我查看了下,名称确实没问题。等等,这属性 public ListData ...原创 2021-03-18 09:23:37 · 403 阅读 · 0 评论 -
Windows 平台安装配置 MongoDB
概述MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center/community安装步骤.原创 2021-03-17 09:24:53 · 204 阅读 · 0 评论 -
一日一技:Ocelot网关使用IdentityServer4认证
概述Ocelot是一个用.NET Core实现的开源API网关技术。IdentityServer4是一个基于OpenID Connect和OAuth2.0的针对ASP.NET Core的框架,以中间件的形式存在。OAuth是一种授权机制。系统产生一个短期的token,用来代替密码,供第三方应用使用。下面来看下如何实现Ocelot基于IdentityServer4统一认证。主要代码实现1、新建认证项目,nuget安装id42、appsettings.json...原创 2021-03-16 09:20:59 · 525 阅读 · 0 评论 -
巧用ffmpeg从视频中截图
概述之前做了个项目,涉及到上传视频,那么我们知道,一般在界面显示的时候,是需要对视频有个预览的效果,就是显示某一帧视频的画面。找了下发现http://ffmpeg.org/可以实现这个功能。FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。主要参数-i——设置输入档名。-f——设置输出格式。-y——若输出文件已存在时则覆盖文.原创 2021-03-15 10:49:55 · 1359 阅读 · 0 评论 -
一日一技:ASP.NET Core Api网关Ocelot初探
概述Ocelot面向使用.NET运行微型服务/面向服务的体系结构的人员,这些体系结构需要在系统中具有统一的入口点。特别是我想与IdentityServer参考和承载令牌轻松集成。Ocelot是按特定顺序排列的一堆中间件。Ocelot将HttpRequest对象操作到由其配置指定的状态,直到到达请求构建器中间件,在该中间件中它创建一个HttpRequestMessage对象,该对象用于向下游服务发出请求。发出请求的中间件是Ocelot管道中的最后一件事。它不会调用下一个中间件。有一块中间件可将HttpRe原创 2021-03-12 09:26:15 · 405 阅读 · 0 评论 -
C# 在PC上的通过蓝牙(bluetooth)发送数据到手机
概述在PC端用.NET开发一个蓝牙下载的程序。实现在PC上查找周围的蓝牙设备(主要是手机),并将PC上的文件通过蓝牙传输到手机上。目前我采用的是OpenNETCF.Net.Bluetooth,能够正常发现周围的蓝牙设备,手机也能够正常进行蓝牙连接并接收文件。代码实现1、查找周围蓝牙设备BluetoothClient bc = new BluetoothClient(); BluetoothDeviceInfo[] bdi; bdi = bc.Disco.原创 2021-03-11 16:17:29 · 866 阅读 · 1 评论 -
Thread类线程常用操作
创建线程线程是通过扩展 Thread 类创建的。扩展的 Thread 类调用 Start()方法来开始子线程的执行。下面的程序演示了这个概念:class ThreadCreationProgram { public static void CallToChildThread() { Console.WriteLine("Child thread starts"); } sta..原创 2021-03-11 13:32:55 · 482 阅读 · 0 评论