随笔分类 - C#.Net
摘要:视图组件是类,为支持分部视图或者在父视图中注入少量Html或Json数据提供了应用程序逻辑。 1 准备工作 Models文件夹中添加City.cs类和CitiesData类,为CitiesData添加服务。 public class City { public string Name { get;
阅读全文
摘要:Razor Pages是生成Html响应的一种简化方式。它的简单性,意味着能够比MVC框架更快获得结果。它将单个视图与一个类关联起来,由该类为视图提供功能,并使用基于文件的路由系统来匹配URL。它的灵活性不如MVC,所以不适合复杂的应用程序。 1 准备工作 2 理解Razor Pages Razor
阅读全文
摘要:1 准备工作 在Startup中启用会话配置。 services.AddDistributedMemoryCache(); services.AddSession(options => { options.Cookie.IsEssential = true; }); app.UseSession()
阅读全文
摘要:1 准备工作 添加包:dotnet add package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation --version 3.1.1 2 开始使用视图 2.1 配置应用程序 HTML响应是使用视图创建的,视图则是混合了HTML元素和C#表达式
阅读全文
摘要:1 准备工作 添加SuppliersController控制器。 [ApiController] [Route("api/[controller]")] public class SuppliersController:ControllerBase { private DataContext _co
阅读全文
摘要:1 准备工作 2 理解RESTful Web服务 Web服务最常见的方法是采用具象状态传输(Representational State Transfer,REST)模式。 REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或者设计就是RESTful,核心就是面向资源,REST专
阅读全文
摘要:1 创建项目 创建一个MyWebApp的空项目。也可以用一下命令行创建。 dotnet new globaljson --sdk-version 3.1 --output MyWebApp 已成功创建模板“global.json file”。 dotnet new web --no-https --
阅读全文
摘要:中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。 如图所示: Mediater是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediater是具体中介者对象,实现抽象类的方
阅读全文
摘要:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余的记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止。 以数组{38,65,97,76,13,27,49}为例,直接插入排序具体步骤如下所示。 第一步插入
阅读全文
摘要:领域事件大部分发生在领域模型的业务逻辑方法上或者领域服务上,我们可以在一个领域事件发生的时候立即调用IMediator的Publish方法来发布领域事件。 我们一般在聚合根的实体类对象的ChangeName、构造方法等方法中发布领域事件,因为无论是应用服务还是领域服务,最终都要调用聚合根中的方法来操
阅读全文
摘要:介绍 选择排序是一种简单直观的排序算法,它的基本原理如下: 对于给定的一组记录,经过第一轮比较后得到最小记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。 排序过程
阅读全文
摘要:领域事件可以切断领域模型之间的强依赖关系,事件发布完成后,由事件的处理者决定如何响应事件,这样我们可以实现事件发布和事件处理之间的解耦。 在.NET中实现领域事件的时候,我们可以使用C#的事件语法,但是事件语法要求事件的处理者被显式地注册到事件的发布者对象中,耦合性很强,所以我们使用MediatR实
阅读全文
摘要:1. 介绍 快速排序是一种非常高效的排序算法,它采用“分而治之”的思想,把大的拆分为小的,小的再拆分为更小的。 其原理如下: 对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有
阅读全文
摘要:上节我们使用Clients.All.SendAsync向连接到当前集线器的所有客户端推送消息,而在很多业务场景中,我们一般都只是向部分客户端推送消息。 在我们进行客户端筛选的时候,有3个筛选参数:ConnectionId、组和用户ID。ConnectionId是SignalR为每个连接分配的唯一标识
阅读全文
摘要:集线器允许任意客户端连接的话会有安全问题,所以应该对连接进行验证,只有通过验证的用户才能连接集线器。SignalR支持验证和授权机制,我们同样可以用Cookie、JWT等方式进行身份信息的传递。由于JWT更符合项目的要求,因此这里讲解SignalR与JWT验证方式的使用。 第1步: 先在配置系统中配
阅读全文
摘要:在多台服务器组成的分布式环境中,我们可以采用黏性会话或者禁用协商的方式来保证来自同一个客户端的请求被同一台服务器处理,但是在分布式环境中,还有其他问题需要解决。 假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,而客户端3、4连接到了服务器B上的ChatRo
阅读全文
摘要:1.推送方式 SignalR其实并不只是对WebSocket的封装,它支持多种服务器推送的实现方式,包括WebSocket、服务器发送事件(server-sent events)和长轮询。 SignalR的JavaScript客户端会先尝试用WebSocket连接服务器;如果失败了,它再用服务器发送
阅读全文
摘要:SignalR的介绍 WebSocket 在传统的HTTP中,只能客户端主动向服务器端发起请求,服务器端无法主动向客户端发送消息。有的业务场景下,我们需要服务器端主动向客户端发送消息,比如Web聊天室、OA系统、站内消息等。 为了实现服务器端向客户端推送消息,在2008年诞生了WebSocket协议
阅读全文
摘要:Swagger中默认没有提供设置自定义HTTP请求报文头的方式,因此对于需要传递Authorization报文头的接口,调试起来很麻烦。我们可以通过对OpenAPI进行配置,从而让Swagger中可以发送Authorization报文头。 我们需要修改Program.cs的AddSwaggerGen
阅读全文
摘要:.NET封装了对于JWT的操作,让我们在程序中使用JWT进行鉴权和授权更简单。 ASP.NET Core中使用封装的JWT 第1步,我们先在配置系统appsettings.json中配置一个名字为JWT的节点,并在节点下创建SigningKey、ExpireSeconds两个配置项,分别代表JWT的
阅读全文