基于ABP vNext 4.X(.Net 5)的Blazor项目创建及配置

0 环境

  1. Visual Studio 2019 (v16.8.3)
  2. dotnet
C:\Users\liudy> dotnet --version
5.0.101
  1. Redis 5.0.3
  2. CLI
C:\Users\liudy> dotnet tool update -g Volo.Abp.Cli
工具“volo.abp.cli”已重新安装最新稳定版本(版本“4.0.2”)

参考:开发环境设置

1 创建解决方案

1.1 目的

.NET5,已经于2020年11月11日正式发布,是一款开源、跨平台产品。.NET5作为新生平台,在容器化、DevOps、微服务、CI/CD、云原生的互联网时代里,优势显著!ABP vNext也已经迁移至.Net5,现在最新的版本是4.0.2。基于此,创建一个基于Blaor UI、EF数据库、分层的、identity server 独立部署的ABP(.Net5)项目,并将数据库修改为 MySql。

1.2 利用CLI创建

定位到目标目录,并使用CLI(abp new Acme.BookStore -u blazor -d ef --separate-identity-server --tiered)创建。

PS C:\Users\liudy> cd E:\Projects\dotnet\Abp\Acme
PS E:\Projects\dotnet\Abp\Acme> abp new Acme.BookStore -u blazor -d ef --separate-identity-server  --tiered

Acme.BookStore:项目名
-u blazor:UI框架采用blazor。
-d ef:表示使用Entity Framework Core作为DB Provider(默认值,可不写)。
–separate-identity-server IDs独立部署
–tiered 分层

参考:CLI使用说明

1.3 创建结果

此时在目标目录下生成了一个aspnet-core文件夹,目录结构如下:
└─aspnet-core
├─src
│ ├─Acme.BookStore.Application、
│ ├─Acme.BookStore.Application.Contracts
│ ├─Acme.BookStore.Blazor
│ ├─Acme.BookStore.DbMigrator
│ ├─Acme.BookStore.Domain
│ ├─Acme.BookStore.Domain.Shared
│ ├─Acme.BookStore.EntityFrameworkCore
│ ├─Acme.BookStore.EntityFrameworkCore.DbMigrations
│ ├─Acme.BookStore.HttpApi
│ ├─Acme.BookStore.HttpApi.Client
│ ├─Acme.BookStore.HttpApi.Host
│ └─Acme.BookStore.IdentityServer
└─test
├─Acme.BookStore.Application.Tests
├─Acme.BookStore.Domain.Tests
├─Acme.BookStore.EntityFrameworkCore.Tests
├─Acme.BookStore.HttpApi.Client.ConsoleTestApp
└─Acme.BookStore.TestBase
除了Test项目,src下一共有12个项目。

1.4 ABP项目间依赖关系

ABP项目依赖关系
参考:Application Startup Template

2 数据库修改为MySQL

这部分内容可以参考:Abp vNext项目搭建及切换成MySQL。但需要注意的是:
“Acme.BookStore.EntityFrameworkCore.DbMigrations”项目下“BookStoreMigrationsDbContextFactory.cs”文件:

var builder = new DbContextOptionsBuilder<EyinzhangMigrationsDbContext>()
                .UseSqlServer(configuration.GetConnectionString("Default"));

修改为:

var builder = new DbContextOptionsBuilder<BookStoreMigrationsDbContext>()
                .UseMySql(configuration.GetConnectionString("Default"), ServerVersion.AutoDetect(configuration.GetConnectionString("Default")));

也就是UseMySql方法进行了重载,否则在进行数据迁移时,可能会出现“A relational store has been configured without specifying either the DbConnection or connection string to use.”错误(数据迁移错误)。

3 Redis配置

3.1 安装

因为之前已经在阿里云服务器上安装了redis,所以就不在本地开发机安装了,直接利用远程的redis服务器。这部分可以参考:CentOS8.2安装Redis及简要配置

3.2 配置

因为要远程连接redis,那么还需要对redis.conf文件进行修改配置。

  1. 允许远程连接
    将bind 127.0.0.1注释掉,允许所有连接
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# bind 127.0.0.1
  1. 修改默认端口
port 6565
  1. 连接密码
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
requirepass  123456

3.3 Redis连接字符串

修改HttpApi.Host和IdentityServer项目下的appsettings.json文件中的Redis配置:

"Redis": {
    "Configuration": "39.101.10.102:6565,password=123456"
  },

4 运行HttpApi.Host

将HttpApi.Host设置为启动项目,如无意外,那么会正常启动:

[20:57:22 INF] Starting Acme.BookStore.HttpApi.Host.
[20:57:28 INF] Loaded ABP modules:
[20:57:28 INF] - Volo.Abp.AuditLogging.AbpAuditLoggingDomainSharedModule
... ....
[20:57:29 DBG] Started background worker: Volo.Abp.BackgroundJobs.BackgroundJobWorker
[20:57:29 DBG] Started background worker: Volo.Abp.IdentityServer.Tokens.TokenCleanupBackgroundWorker
[20:57:29 INF] Initialized all ABP modules.
[20:57:30 INF] Now listening on: https://localhost:5001
[20:57:30 INF] Now listening on: http://localhost:5000
[20:57:30 INF] Application started. Press Ctrl+C to shut down.
[20:57:30 INF] Hosting environment: Production
[20:57:30 INF] Content root path: E:\Projects\dotnet\Abp\Acme\aspnet-core\src\Acme.BookStore.HttpApi.Host

Swagger

5 IIS配置

因为是分层、IDs独立模式,因此要正常运行Blazor,需要先运行HttpApi.Host和IdentityServer两个项目。一种方式是通过命令行直接运行(如: dotnet Acme.BookStore.HttpApi.Host.dll)。考虑到这种方式比较麻烦,每次都要手动运行。因此考虑将其部署到开发机的IIS中。

5.1 IIS部署

这部分可参考:.Net Core 3.1 项目发布到IIS教程

5.2 端口修改

在创建解决方案时,IdentityServer项目的端口配置(launchSettings.json)可能如下:

  "profiles": {
    "Acme.BookStore.IdentityServer": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:44328",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }

也就是使用44328这个端口。而HttpApi.Host则使用44380端口。为避免在VisualStudio里运行与IIS端口冲突和便于记忆,将IdentityServer项目在IIS中的端口调整为了8090,HttpApi.Host项目在IIS中的端口为8070。
IDS
相应地,我们将Blazor项目的appsettings.json文件中对应端口修改为IIS的设置:

{
  "AuthServer": {
    "Authority": "http://localhost:8090",
    "ClientId": "BookStore_Blazor",
    "ResponseType": "code"
  },
  "RemoteServices": {
    "Default": {
      "BaseUrl": "http://localhost:8070"
    } 
  } 
}

注意:在设置IIS端口时,一开始为了方便,直接设置了个6000端口,发现用Edge死活也打不开,提示ERR_UNSAFE_PORT错误。经查,Chromium内核浏览器有默认非安全端口导致。可参考:Chrome 错误代码:ERR_UNSAFE_PORT

6 运行Blazor

将Acme.BookStore.Blazor项目设置为启动项目,Ctrl+F5运行项目。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:44307
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: E:\Projects\dotnet\Abp\Acme\aspnet-core\src\Acme.BookStore.Blazor

Blazor

6.1 ABP vNext中IdentityServer禁用SSL/未启用SSL问题

使用基于Chromium的 Edge浏览器访问Blazor站点,点击登录时,发现登录不成功。直接访问http://localhost:8090(本示例)依然登录不成功。但换成IE浏览器发现可以正常使用。

6.2 解决方法

在启用了Identity Server 4 的网站上使用HTTP(未启用SSL/禁用SSL)时,由于Chrome在8x版本中所做的更改,用户可能无法登录。问题原因可参考:.NET Core 3.1 中的中断性变更。问题解决可参考:在使用ABP VNEXT中,如何解决IdentityServer4的登录问题

由于上面的方法要改动的地方较多,同时在生产环境中,为了提升安全,还是应该启用SSL。因此,我在IIS中将IdentityServer站点启用SSL。相应地将Blazor项目的appsettings.json文件中的Authority设置修改为:https://localhost:8090

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页