- Visual Studio 2019 (v16.8.3)
- dotnet
C:Usersliudy> dotnet --version 5.0.101
- Redis 5.0.3
- CLI
C:Usersliudy> 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:Usersliudy> cd E:ProjectsdotnetAbpAcme PS E:ProjectsdotnetAbpAcme> 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个项目。
参考:Application Startup Template
这部分内容可以参考:Abp vNext项目搭建及切换成MySQL。但需要注意的是:
“Acme.BookStore.EntityFrameworkCore.DbMigrations”项目下“BookStoreMigrationsDbContextFactory.cs”文件:
var builder = new DbContextOptionsBuilder() .UseSqlServer(configuration.GetConnectionString("Default"));
修改为:
var builder = new DbContextOptionsBuilder() .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文件进行修改配置。
- 允许远程连接
将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
- 修改默认端口
port 6565
- 连接密码
# 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 1234563.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:ProjectsdotnetAbpAcmeaspnet-coresrcAcme.BookStore.HttpApi.Host5 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。
相应地,我们将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:ProjectsdotnetAbpAcmeaspnet-coresrcAcme.BookStore.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



