09 2022 档案
摘要:上节我们使用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的
阅读全文
摘要:实现用户登录功能的经典做法是用Session,但是在前后端分离、分布式环境下已经不适应了,而现在我们倾向于采用JWT代替Session实现登录。 JWT全称是JSON web token,它是使用JSON格式来保存令牌信息的。JWT机制不是把用户的登录信息保存在服务器端,而是把登录信息(也叫作令牌)
阅读全文
摘要:在一个系统中,不是所有功能都能被自由地访问的,比如有的功能需要注册用户才能访问,有的功能需要VIP用户才能访问。针对资源的访问限制有两个概念:Authentication与Authorization,即鉴权与授权。 Authentication:用来对访问者的用户身份进行验证; Authorizat
阅读全文
摘要:事件绑定 1.Vue如何处理事件? v-on 指令用法 <input type = 'button' v-on:click = 'num++'/> v-on 简写形式 <input type = 'button' @click = 'num++'/> 2.事件函数的调用方式 直接绑定函数名称 <bu
阅读全文
摘要:指令 1.什么是指令? 指令的本质就是自定义属性 指令的格式:以v-开始(如:v-cloak) 2.v-cloak指令用法 插值表达式存在的问题:“闪动” 如何解决该问题:使用v-cloack指令 解决该问题的原理:先隐藏,替换好值之后在显示最终值 1.提供样式 2.在插值表达式所在标签中添加v-c
阅读全文
摘要:#1.Vue概述 Vue.js的创建者:尤雨溪 2014年2月,Vue.js正式发布 2015年10月27日,正式发布1.0.0 2016年4月27日,发布2.0的预览版本 ##Vue:渐进式JavaScript框架 声明式渲染->组件系统->客户端路由->集中式状态管理->项目构建 官网:http
阅读全文
摘要:Task是一个更高级的抽象概念,它代表了一个并发操作,而该操作并不一定依赖线程来完成。Task是可以组合的(可以将它们通过延续(continuation)操作串联在一起)。它们可以使用线程池减少启动延迟,也可以通过TaskCompletionSource采用回调的方式避免多个线程同时等待I/O密集型
阅读全文
摘要:线程是一个可以独立执行的执行路径。 **每一个线程都运行在一个操作系统进程中。**这个进程提供了程序执行的独立环境。 在单线程程序中,进程中只有一个线程运行,因此线程可以独立使用进程环境。而在多线程程序中,一个进程中会运行多个线程。它们共享同一个执行环境(特别是内存)。这在一定程度上说明了多线程的作
阅读全文
摘要:C#.Net 集合 C#集合:枚举IEnumerable C#集合:ICollection和IList接口 C#集合:Array类 C#集合:List、Queue、Stack和Set C#集合:字典 算法 C#:快速排序 Asp.Net Core ASP.NET Core 启动的配置 ASP.NET
阅读全文
摘要:.NET Core在System.Collections.Concurrent命名空间下提供了线程安全的集合: | 并发集合 | 非并发等价集合 | | | | | ConcurrentStack<T> | Stack<T> | | ConcurrentQueue<T> | Queue<T> | |
阅读全文
摘要:任务并行是PFX中最底层的并行化方式。相关的类定义在System.Threading.Tasks命名空间,其中包括: Task:管理一个工作单元; Task<TResult>:管理一个带有返回值的工作单元; TaskFactory:创建任务; TaskFactory<TResult>:创建具有指定返
阅读全文
摘要:1.[ThreadStatic]特性 实现线程本地存储最简单的方式是在静态字段上附加ThreadStatic特性: [ThreadStatic] static int _x; 这样,每个线程都会得到一个_x的独立副本。 但是,[ThreadStatic]并不支持实例字段(它对实例字段并不会产生任何作
阅读全文
摘要:PFX在Parallel类中提供了三个静态方法作为结构化并行的基本形式: Parallel.Invoke方法:并行执行一组委托。 Parallel.For方法:执行与C# for循环等价的并行方法。 Parallel.ForEach方法:执行与C#foreach循环等价的并行方法。 这三个方法都会阻
阅读全文
摘要:PLINQ可以自动并行化本地LINQ查询。易于使用是PLINQ的优势,因为它将工作划分和结果整理的任务交给了.NET Core。 要使用PLINQ,只需直接在输入序列上调用AsParallel()方法,而后和先前一样编写普通的LINQ查询即可。 例如,以下范例列出了3~100 000之间的所有素数,
阅读全文
摘要:**通过编程发挥多核或多处理器优势的方式称为并行编程。**它是多线程这个更宽泛概念的一个子集。 多线程API和以下可以发挥多核处理器能力的各种结构: 并行LINQ(PLINQ) Parallel类 任务并行结构 并发集合 这些类型一般统称为并行框架(Parallel Framework,PFX)。
阅读全文
摘要:如果需要定期重复执行一些方法,最容易的方式就是使用定时器。相比以下方式,定时器既方便使用又能高效地利用内存和资源。 new Thread(delegate () { while (enabled) { DoSomeAction(); Thread.Sleep(TimeSpan.FromHours(2
阅读全文
摘要:最简单的信号发送结构是事件等待句柄(注意它和C#的事件是无关的)。事件等待句柄有三种实现:AutoResetEvent、ManualResetEvent(Slim)和CountdownEvent。前两种基于通用的EventWaitHandle类,它们继承了基类的所有功能。 AutoResetEven
阅读全文