dotNET Core 如何调用 WebService

0.使用背景

因为现在的项目都是基于 .NET Core 的,但是某些需要调用第三方的 WebService 服务,故有了此文章。其基本思路是通过微软提供的 Svcutil 工具生成代理类,然后通过 System.ServiceModel 来调用代理类所提供的对象与方法。

Abp 源码分析:十三、多语言(本地化)处理

0.简介

如果你所开发的需要走向世界的话,那么肯定需要针对每一个用户进行不同的本地化处理,有可能你的客户在日本,需要使用日语作为显示文本,也有可能你的客户在美国,需要使用英语作为显示文本。如果你还是一样的写死错误信息,或者描述信息,那么就无法做到多语言适配。

Abp 框架本身提供了一套多语言机制来帮助我们实现本地化,基本思路是 Abp 本身维护一个键值对集合。只需要将展示给客户的文字信息处都使用一个语言 Key 来进行填充,当用户登录系统之后,会取得当前用户的区域文化信息进行文本渲染。

TIM–20180817191430

Abp 源码分析:十二、多租户体系与权限验证

0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的。 1.多租户的概念 多租户系统又被称之为 Saas ,比如阿里云就是一个典型的多租户系统,用户本身就是一个租户,可以在上面购买自己的 ECS 实例,并且自己的数据与其他使用者(租户)所隔绝,两者的数据都是不可见的。 那么 Abp 是如何实现数据隔离的呢? 1.1 单部署-单数据库 如果你的软件系统仅部署一个实例,并且所有租户的数据都是存放在一个数据库里面的,那么可以通过一个 TenantId (租户 Id) 来进行数据隔离。那么当我们执行 SELECT 操作的时候就会附加上当前登录用户租户 Id 作为过滤条件,那么查出来的数据也仅仅是当前租户的数据,而不会查询到其他租户的数据。 1.2 单部署-多数据库 Abp 还提供了另外一种方式,即为每一个租户提供一个单独的数据库,在用户登录的时候根据用户对应的租户 ID,从一个数据库连接映射表获取到当前租户对应的数据库连接字符串,并且在查询数据与写入数据的时候,不同租户操作的数据库是不一样的。 2.多租户系统的权限验证 从上一篇文章我们知道了在权限过滤器与权限拦截器当中,最终会使用 IFeatureChecker 与 IPermissionChecker 来进行权限校验,并且它还持久一个用户会话状态 IAbpSession 用于存储识别当前访问网站的用户是谁。 2.1 用户会话状态 基本做过网站程序开发的同学都知道用于区分每一个用户,我们需要通过 Session 来保存当前用户的状态,以便进行权限验证或者其他操作。而 Abp 框架则为我们定义了一个统一的会话状态接口 IAbpSession ,用于标识当前用户的状态。在其接口当中主要定义了三个重要的属性,第一个 UserId (用户 Id),第二个就是 TenantId (租户 Id),以及用于确定当前用户是租户还是租主的 MultiTenancySides 属性。 除此之外,还拥有一个 Use() 方法,用户在某些时候临时替换掉当前用户的 UserId 与 TenantId 的值,这个方法在我的《Abp + Grpc 如何实现用户会话状态传递》文章当中有讲到过。 而针对这个方法的实现又可以扯出一大堆知识,这块我们放在后面再进行精讲,这里我们还是主要通篇讲解一下多租户体系下的数据过滤与权限验证。 2.1.1 默认会话状态的实现 IAbpSession 当中的值默认是从 JWT 当中取得的,这取决于它的默认实现 ClaimsAbpSession,它还继承了一个抽象父类 AbpSessionBase ,这个父类主要是实现了 Use() 方法,这里略过。

Abp 源码分析:十一、权限验证

0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证。在 Abp 框架内部,权限分为两块,一个是功能(Feature),一个是权限项(Permission),在更多的时候两者仅仅是概念不同而已,大体处理流程还是一样的。 由于 Abp 本身是针对多租户架构进行设计的,功能是相对于租户而言,比如针对 A 租户他每月的短信发送配额为 10000 条,而针对 B 租户其配额为 5000 条,可能 C 租户该功能都没有开通。 本篇文章仅针对基本的验证机制进行解析,后续文章会进行详解。 0.1 验证流程图 1.启动流程 1.1 流程图 1.2 代码流程 首先在注入 Abp 框架的时候,通过注入过滤器一起将权限验证过滤器进行了注入。 1 2 3 4 5 6 7 8 9 10 11 12 13 internal static class AbpMvcOptionsExtensions { // ... 其他代码 private static void AddFilters(MvcOptions options) { // ... 其他注入的过滤器 options.Filters.AddService(typeof(AbpAuthorizationFilter)); // ... 其他注入的过滤器 } // .

Abp 源码分析:十、异常处理

0.简介 Abp 框架本身针对内部抛出异常进行了统一拦截,并且针对不同的异常也会采取不同的处理策略。在 Abp 当中主要提供了以下几种异常类型: 异常类型 描述 AbpException Abp 框架定义的基本异常类型,Abp 所有内部定义的异常类型都继承自本类。 AbpInitializationException Abp 框架初始化时出现错误所抛出的异常。 AbpDbConcurrencyException 当 EF Core 执行数据库操作时产生了 DbUpdateConcurrencyException 异常 的时候 Abp 会封装为本异常并且抛出。 AbpValidationException 用户调用接口时,输入的DTO 参数有误会抛出本异常。 BackgroundJobException 后台作业执行过程中产生的异常。 EntityNotFoundException 当仓储执行 Get 操作时,实体未找到引发本异常。 UserFriendlyException 如果用户需要将异常信息发送给前端,请抛出本异常。 AbpRemoteCallException 远程调用一场,当使用 Abp 提供的 AbpWebApiClient 产生问题的时候 会抛出此异常。 1.启动流程 Abp 框架针对异常拦截的处理主要使用了 ASP .NET CORE MVC 过滤器机制,当外部请求接口的时候,所有异常都会被 Abp 框架捕获。Abp 异常过滤器的实现名称叫做 AbpExceptionFilter,它在注入 Abp 框架的时候就已经被注册到了 ASP .NET Core 的 MVC Filters 当中了。 1.1 流程图 1.2 代码流程 注入 Abp 框架处:
Built with Hugo
主题 StackJimmy 设计