ASP.NET Core

解读大内老A的《.NET Core框架本质》

拟墨画扇 提交于 2020-04-22 03:54:39
老A说的一句话让我很受启发,想要深入了解框架,你要把精力聚焦在 架构设计 的层面来思考问题。而透彻了解底层原理,最好的笨办法就是根据原理对框架核心进行 重建 或者说 再造 。看起来没有捷径,也是最快的捷径。 题外话   相信很多读者已经看过老A写的这篇文章《 200行代码,7个对象——让你了解ASP.NET Core框架的本质 》,这是一篇模仿和重建的典范。重建说白了就是模仿,模仿有一个前置条件就是你对底层原理要烂熟于心。否则画虎难画骨,原本要画虎,最后出来的是只猫。 要理解原理就要去阅读源码,就像新人学开车,如何使用尚且磕磕碰碰,更何况让你去了解汽车的构造和引擎。   所以老A是引路人,我像个门外汉一样对前辈的文章解读不下5遍。我有几个疑问,1.为什么是7个对象?2.这些对象如何分类,如何排序?3.这些对象发明的那个“无”是什么?   在我深入学习和解读的时候,我越加感觉到老A的这篇文章很值得去深入解读,所谓知其然,知其所以然,这样在编码过程才会游刃有余,以下开始我个人的解读。 知识准备 委托 构建模式 适配器模式 引子 public class Program { public static void Main() => new WebHostBuilder() .UseKestrel() .Configure(app => app.Use(context => context

.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端

坚强是说给别人听的谎言 提交于 2020-04-22 03:49:02
.NET Core love gRPC 千呼万唤的 .NET Core 3.0 终于在 9 月份正式发布,在它的众多新特性中,除了性能得到了大大提高,比较受关注的应该是 ASP.NET Core 3.0 对 gRPC 的集成了。 它的源码托管在 grpc-dotnet 这个 Github 库中,由微软 .NET 团队与谷歌 gRPC 团队共同维护. .NET Core 对 gRPC 的支持在 grpc 官方仓库早已有实现(grpc/csharp),但服务端没有很好地与 ASP.NET Core 集成,使用起来还需要自己进行一些集成扩展。 而 ASP.NET Core 3.0 新增了 gRPC 服务的托管功能,能让 gRPC 与 ASP.NET Core 框架本身的特性很好地结合,如日志、依赖注入、身份认证和授权,并由 Kestrel 服务器提供 HTTP/2 链接,性能上得到充分保障。 推荐把项目中已有的 RPC 框架或者内部服务间 REST 调用都迁移到 gRPC 上,因为它已经是云原生应用的标准 RPC 框架,在整个 CNCF 主导下的云原生应用开发生态里 gRpc 有着举足轻重的地位。 对于 gRPC 的使用方式,前段时间已经有其他大神写的几篇文章了,这里就不再赘述了。 本文主要介绍的是区别于标准使用规范的,但对.NET 应用更加友好的使用方式,最后会提供源码来展示。

dotnet代码管理之密钥分离策略

空扰寡人 提交于 2020-04-22 03:44:44
引言   互联网每隔一段时间就会爆出 【某程序猿在代码托管平台上传了公司机密配置信息,导致公司核心数据被黑客获取或修改】, 一茬又一茬背锅侠层出不穷。 拯救自我   软件工程理论早以加粗字体给出 经典原则:Never store production passwords or other sensitive data in source code 依据这个原则,我们来说一些.Net 开发生涯几种敏感信息分离的方案。 头脑风暴 常规思路是【external file方式托管敏感信息】,.gitingore忽略该文件,在部署时预先拷贝该文件到部署目录。 .Net Framework   可尝试在 appSettings 配置节启用file属性,file属性可引用外部配置文件,具备为原appSetttings新增或重写同名设置的能力, 理论传送门 原配置节 <configuration> <appSettings file= " appsecrets.config " > <add key= " FtpUserId " value= " test_userid " /> <add key= " FtpPwd " value= " test-pwd " > </appSettings> </configuration> 外置配置文件 <?xml version= " 1.0 "

Asp.net core下利用EF core实现从数据实现多租户(1)

て烟熏妆下的殇ゞ 提交于 2020-04-22 03:39:11
前言 随着互联网的的高速发展,大多数的公司由于一开始使用的传统的硬件/软件架构,导致在业务不断发展的同时,系统也逐渐地逼近传统结构的极限。 于是,系统也急需进行结构上的升级换代。 在服务端,系统的I/O是很大的瓶颈。其中数据库的I/O最容易成为限制系统效率的一环。在优化数据库I/O这一环中,可以从优化系统调用数据库效率、数据库自身效率等多方面入手。 一般情况下,通过升级数据库服务器的硬件是最容易达到的。但是服务器资源不可能无限扩大,于是从调用数据库的效率方面入手是目前主流的优化方向。 于是读写分离、分库分表成为了软件系统的重要一环。并且需要在传统的系统架构下,是需要做强入侵性的修改。 什么是多租户: 多租户的英文是Multiple Tenancy,很多人把多租户和Saas划上等号,其实这还是有区别的。我们今天不讨论Sass这种如此广泛的议题。 现在很多的系统都是to B的,它们面向的是组织、公司和商业机构等。每个机构会有独立的组织架构,独立的订单结构,独立的服务等级和收费。 这就造成了各个机构间的数据是天然独立的,特别是部分的公司对数据的独立和安全性会有较高要求,往往数据是需要独立存储的。 由于多租户数据的天然独立,造成了系统可以根据机构的不同进行分库分表。所以这里讨论的多租户,仅限于数据层面的! 写这篇文章原因 其实由于一个群的朋友问到了相关的问题

gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(上)

試著忘記壹切 提交于 2020-04-22 01:52:50
上一篇文章(大约半年前写的): https://www.cnblogs.com/cgzl/p/11246324.html 建立Go项目 在GOPATH的src下面建立一个文件夹 protobuf-go,然后在里面执行命令 go mod init github.com/solenovex/protobuf-go 这个命令是用来初始化go module的。 命令执行后在该目录生成go.mod文件,其内容如下: 其实直接执行go mod init 也行,默认会取当前文件夹的名字作为项目名。 如果你使用的是Goland,那么需要启用Go modules集成: 然后我们需要安装Protocol buffer的 Go 支持库: go get -u github.com/golang/protobuf/protoc-gen-go 安装好之后: 下面会出现require github.com/…. 后边显示indirect,说明我们的代码还没有对其进行直接引用 建立main.go,代码如下: 然后执行命令 go run main.go 如果输出 "hello world!" 就说明一切正常。 建立proto 在项目下建立src/first文件夹,在里面建立person.proto文件: 下面需要通过这个proto文件,生成go的代码,命令行执行: protoc --proto_path src/

14.ASP.NET Core请求处理管道

杀马特。学长 韩版系。学妹 提交于 2020-04-22 00:28:30
原文: 14.ASP.NET Core请求处理管道 在这篇文章中,我将通过一个示例,来讲解ASP.NET Core中的请求处理管道。在这篇文章中,我们将讨论下面几个点: 理解ASP.NET Core请求处理管道 怎样在ASP.NET中创建并注册多个中间件组件? 请求管道中,中间件执行的顺序是咋样的? 理解ASP.NET Core请求处理管道 为了理解ASP.NET Core中的请求处理管道,我们来修改一下Configure方法。这里我们向请求管道中注册了三个中间件组件。正如你所见,前面两个中间件是使用Use扩展方法注册的,最后一个是使用Run扩展方法注册的。 代码解释: 首先我们向 Configure 方法注入了日志中间件,也就是 ILogger<Startup>. Program类中的Main方法调用 CreateDefaultBuilder方法,来配置日志。 在上面图片中,你可以发现,日志提供了Console、Debug、以及EventSource.在这篇例子中,我使用的日志实例来记录日志。 如果你是通过.NET Core CLI来运行程序的话,那么你可以在命令行窗口可以看到日志信息,如果你是通过Visual Studio来运行程序的话,你可以在输出窗口看到日志信息。 现在运行程序就会发现: 你会看到输出的顺序: Middleware1: Incoming Request

16.ASP.NET Core应用程序中的开发者异常页面中间件

邮差的信 提交于 2020-04-21 23:03:12
Developer Exception Page Middleware in ASP.NET Core Application 在这篇文章中,我将向大家介绍,怎么在ASP.NET Core应用程序中,使用异常页面中间件,来处理我们程序中未处理的异常。在阅读这篇文章之前,可以看看我这个系列的之前写的文章。异常处理是所有应用程序中,特别关键的一个点,我们可以通过各种方式方法,来处理异常,但是在这篇文章我要向大家讲解,怎样使用异常页面中间件来处理异常。这篇文章中,我们主要讨论下面几个点: 什么是开发者异常页面中间件? 怎样在ASP.NET Core应用程序中,使用异常页面中间件? 怎样定制异常中间件? 我们在哪配置异常页面中间件? 理解异常页面中间件 默认情况下,ASP.NET Core应用程序,如果发生了异常,就是仅仅简单的返回一个状态码。我们通过一个例子,来了解一下。我们修改一下Configure方法,返回一个异常: 运行程序:就会看到这样的页面。 正如你上图所看到的,返回了一个500状态码,表示:服务器内部异常。但是作为一个开发者,当你开发应用程序,你应该要在页面上知道,异常的详细信息,然后你才能分析,并采取措施解决Bug. 怎样在ASP.NET Core应用程序中,使用DeveloperExceptionPage 中间件? 当程序发生异常的时候

.NET Core技术研究-主机Host

我与影子孤独终老i 提交于 2020-04-21 15:46:37
前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计。今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的设计和构建启动过程。 一、什么是主机 主机是一个封装了应用资源的对象,即:主机封装了一堆应用资源,封装了哪些应用资源呢? 依赖注入框架 DI Logging日志 Configuration 配置 托管服务:IHostedService服务接口的实现 二、Web主机和通用主机 先说 Web主机 :即ASP.NET Core Web主机,概括的讲就是 托管Web程序的Host 。在低于 3.0 的 ASP.NET Core 版本中, Web 主机用于 HTTP 工作负载 。 我们新建一个ASP.NET Core2.2的Web应用程序,在Program类的Main函数中我们可以看到整个WebHost的构造、启动过程: .NET Core提供Web主机的同时,还提供了一个通用主机的概念。 通用主机Host和Web主机提供了类似的架构和功能,包含依赖注入框架DI、日志、配置、各类应用(托管服务)。通用主机的出现,给了我们更多开发的选择,比如说后台处理任务场景。 在.NET Core3.1版本后,微软不再建议将 Web 主机用于 Web 应用,直接使用Host通用主机来替换WebHost, 一句话

ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

旧时模样 提交于 2020-04-21 15:41:26
原文: Filters 作者: Steve Smith 翻译: 刘怡(AlexLEWIS) 校对: 何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码。过滤器可以配置为全局有效、仅对控制器有效或是仅对 Action 有效。 查看或下载演示代码 . 过滤器如何工作? 不同的过滤器类型会在执行管道的不同阶段运行,因此它们各自有一套适用场景。根据你实际要解决的问题以及在请求管道中执行的位置来选择创建不同的过滤器。运行于 MVC Action 调用管道内的过滤器有时被称为 过滤管道 ,当 MVC 选择要执行哪个 Action 后就会先执行该 Action 上的过滤器。 不同过滤器在管道的不同位置运行。像授权这样的过滤器只运行在管道的靠前位置,并且其后也不会跟随 action。其它过滤器(如 action 过滤器等)可以在管道的其它部分之前或之后执行,如下所示。 选择过滤器 授权过滤器 用于确定当前用户的请求是否合法。 资源过滤器 是授权之后第一个用来处理请求的过滤器,也是最后一个接触到请求的过滤器(因为之后就会离开过滤器管道)。在性能方面,资源过滤器在实现缓存或短路过滤器管道尤其有用。 Action 过滤器 包装了对单个 action 方法的调用,可以将参数传递给 action 并从中获得 action result。 异常过滤器 为 MVC

Asp.net Core 跨域配置

匆匆过客 提交于 2020-04-21 14:44:24
一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:48057' is therefore not allowed access. ASP.net Core 跨域有两种,全局和区域 全局跨域: 打开Startup.cs文件.在ConfigureServices方法中添加以下代码 1.配置跨域处理,允许所有来源:       // 配置跨域处理,允许所有来源: services.AddCors(options => options.AddPolicy( " 自定义的跨域策略名称 " , p => p.AllowAnyOrigin()) ); 2.允许一个或多个具体来源: // 允许一个或多个具体来源: services.AddCors(options => { // Policy 名稱 CorsPolicy 是自訂的,可以自己改 options.AddPolicy( " 跨域规则的名称 " , policy => { // 設定允許跨域的來源,有多個的話可以用 `,` 隔開 policy.WithOrigins( " http://localhost:3000 " ,