
CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载导读Auto SetupOrchardCore.AutoSetup是 Orchard Core 框架内置的一个基础设施级功能模块它让应用Application与其多租户Tenant站点能够在首次收到请求时自动完成安装无需人工打开安装向导填写表单。本文以官方模块文档为主体结合仓库内模块源码、Web 宿主工程与单元测试完整讲解appsettings.json配置参数、User Secrets 与环境变量注入、功能启用方式、以及多实例共享数据库场景下的分布式锁保证帮助你在开发、CI/CD 与生产交付中实现零手工介入的站点初始化。模块定位与核心机制AutoSetup 模块位于 src/OrchardCore.Modules/OrchardCore.AutoSetup从其 Manifest.cs 可以看到它被归类为Infrastructure类别依赖OrchardCore.Setup模块描述为允许自动安装应用/租户。它本质上是一个按需on-demand安装机制不是应用启动时就同步安装所有站点而是在某个租户的 Shell 处于未初始化Uninitialized状态、且首个请求到达时由中间件Middleware触发安装流程。核心执行链路由 AutoSetupMiddleware.cs 与 AutoSetupService.cs 构成中间件根据当前请求对应的ShellSettings名称在配置的Tenants列表中匹配TenantSetupOptions若 Shell 未初始化先尝试获取分布式锁保证多实例环境下的原子性再次确认 Shell 仍为未初始化后调用IAutoSetupService.SetupTenantAsync安装成功后若当前是Default根租户则提前为其余租户创建 Shell 配置不安装其余租户之后在各自首次请求时按需安装成功响应会重定向302回站点根路径失败则返回503 Service Unavailable。JSON 配置参数在 appsettings.json 中声明安装清单AutoSetup 的全部参数都定义在配置节OrchardCore:OrchardCore_AutoSetup之下配置节名硬编码于 Startup.cs 的ConfigSectionName常量。官方文档给出的appsettings.json完整示例{ OrchardCore: { OrchardCore_AutoSetup: { AutoSetupPath: , Tenants: [ { ShellName: Default, SiteName: AutoSetup Example, SiteTimeZone: Europe/Amsterdam, AdminUsername: admin, AdminEmail: infoorchardproject.net, AdminPassword: OrchardCoreRules1!, DatabaseProvider: Sqlite, DatabaseConnectionString: , DatabaseTablePrefix: , RecipeName: SaaS }, { ShellName: AutoSetupTenant, SiteName: AutoSetup Tenant, SiteTimeZone: Europe/Amsterdam, AdminUsername: tenantadmin, AdminEmail: tenantorchardproject.net, AdminPassword: OrchardCoreRules1!, DatabaseProvider: Sqlite, DatabaseConnectionString: , DatabaseTablePrefix: tenant, RecipeName: Agency, RequestUrlHost: , RequestUrlPrefix: tenant, FeatureProfile: my-profile } ] } } }顶层参数参数说明AutoSetupPath触发每个租户 AutoSetup 的 URL。若为空则在该租户的首个请求如/、/tenant-prefix时自动触发安装Tenants需要安装的租户列表每个租户的参数参数说明ShellName租户的技术名称Shell / Tenant 名。不能为空且只能包含字符源码校验规则为^\w$正则不允许空格。默认租户必须使用DefaultSiteName站点名称AdminUsername租户超级用户的用户名AdminEmail租户超级用户的邮箱AdminPassword租户超级用户的密码DatabaseProvider数据库提供程序如Sqlite、SqlServer、Postgres等需与项目注册的提供程序一致DatabaseConnectionString连接字符串DatabaseTablePrefix数据库表前缀可用于在同一数据库中安装多个租户如示例中租户使用tenant前缀以与默认站点隔离RecipeName租户安装使用的 Recipe配方名称如SaaS、Agency、Blank等RequestUrlHost租户绑定的主机名HostRequestUrlPrefix租户的 URL 前缀FeatureProfile可选租户默认使用的功能配置文件Feature Profile名称仅在使用Feature Profiles功能时适用详见 Tenants 模块文档!!! note -Tenants数组必须包含ShellName等于Default的根租户。 - 每个租户都是按需安装在租户的首次请求时安装。 - 若提供了AutoSetupPath则必须用它来触发每个租户的安装例如 -/autosetup—— 触发根租户Root tenant的安装 -/mytenant/autosetup—— 自动安装mytenant。源码中的参数校验规则结合 AutoSetupOptions.cs 与 TenantSetupOptions.cs配置在启动时会被IValidatableObject校验以下规则值得注意AutoSetupPath若不为空必须以/开头Tenants列表不能为空且有且仅有一个IsDefault即ShellName为Default的租户ShellName必须匹配^\w$非空、纯单词字符、无空格且非默认租户不得与Default冲突RequestUrlPrefix不能包含多于一个路径段不能含/SiteName、AdminUsername、AdminEmail、AdminPassword、RecipeName、SiteTimeZone均为必填DatabaseProvider必须是已注册的有效提供程序若该提供程序要求连接字符串HasConnectionString则DatabaseConnectionString必填LockOptions.LockExpiration与LockOptions.LockTimeout必须大于零。此外从源码可以看到租户配置还支持一个文档表格未列出的DatabaseSchema字段对应OrchardCore.Data的 Schema 概念在TenantSetupOptions与安装上下文SetupContext中均会传递可视为实现层面的补充能力。敏感信息处理User Secrets 与环境变量如果你的 JSON 配置包含敏感信息如管理员密码或不想将其提交到仓库例如并非整个开发团队都使用 AutoSetup官方文档推荐使用User Secrets或环境变量代替。使用 User Secrets本地开发User Secrets 仅在本地开发时可用以 JSON 文件形式存储。你可以把整个配置节原样搬进secrets.json也可以逐项通过命令行设置这会扁平化secrets.json中的已有结构cd src/OrchardCore.Cms.Web dotnet user-secrets init dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:ShellName Default dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:SiteName AutoSetup Example dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:SiteTimeZone Europe/Amsterdam dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:AdminUsername admin dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:AdminEmail infoorchardproject.net dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:AdminPassword OrchardCoreRules1! dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:RecipeName SaaS dotnet user-secrets set OrchardCore:OrchardCore_AutoSetup:Tenants:0:DatabaseProvider Sqlite如果你基于 Orchard Core 完整源码工作如贡献代码由于 OrchardCore.Cms.Web.csproj 预配置了UserSecretsId上述设置对所有源码副本都生效——这对参与 Orchard Core 开发非常有用。如果想去掉该行为只需删除对应副本OrchardCore.Cms.Web.csproj中的UserSecretsId元素即可。使用环境变量服务器与本地均可用环境变量在服务器和本地机器上都可用但如果你有多个项目必须加前缀以避免冲突。配置键使用双下划线__作为层级分隔符OrchardCore__OrchardCore_AutoSetup__AutoSetupPath: OrchardCore__OrchardCore_AutoSetup__Tenants__0__ShellName: Default OrchardCore__OrchardCore_AutoSetup__Tenants__0__SiteName: AutoSetup Example OrchardCore__OrchardCore_AutoSetup__Tenants__0__SiteTimeZone: Europe/Amsterdam OrchardCore__OrchardCore_AutoSetup__Tenants__0__AdminUsername: admin OrchardCore__OrchardCore_AutoSetup__Tenants__0__AdminEmail: infoorchardproject.net OrchardCore__OrchardCore_AutoSetup__Tenants__0__AdminPassword: OrchardCoreRules1! OrchardCore__OrchardCore_AutoSetup__Tenants__0__DatabaseProvider: Sqlite OrchardCore__OrchardCore_AutoSetup__Tenants__0__DatabaseConnectionString: OrchardCore__OrchardCore_AutoSetup__Tenants__0__DatabaseTablePrefix: OrchardCore__OrchardCore_AutoSetup__Tenants__0__RecipeName: SaaS OrchardCore__OrchardCore_AutoSetup__Tenants__1__ShellName: AutoSetupTenant OrchardCore__OrchardCore_AutoSetup__Tenants__1__SiteName: AutoSetup Tenant OrchardCore__OrchardCore_AutoSetup__Tenants__1__SiteTimeZone: Europe/Amsterdam OrchardCore__OrchardCore_AutoSetup__Tenants__1__AdminUsername: tenantadmin OrchardCore__OrchardCore_AutoSetup__Tenants__1__AdminEmail: tenantorchardproject.net OrchardCore__OrchardCore_AutoSetup__Tenants__1__AdminPassword: OrchardCoreRules1! OrchardCore__OrchardCore_AutoSetup__Tenants__1__DatabaseProvider: Sqlite OrchardCore__OrchardCore_AutoSetup__Tenants__1__DatabaseConnectionString: OrchardCore__OrchardCore_AutoSetup__Tenants__1__DatabaseTablePrefix: OrchardCore__OrchardCore_AutoSetup__Tenants__1__RecipeName: Agency OrchardCore__OrchardCore_AutoSetup__Tenants__1__RequestUrlHost: OrchardCore__OrchardCore_AutoSetup__Tenants__1__RequestUrlPrefix: tenant本地快速启动验证出于测试目的你可以把上述环境变量加入OrchardCore.Cms.Web项目launchSettings.json中名为web的 profile然后启动dotnet run --launch-profile web启用 Auto Setup 功能要启用 Auto Setup 功能需要在 Web 项目的启动文件中注册对应 Setup 特性public void ConfigureServices(IServiceCollection services) { services .AddOrchardCms() .AddSetupFeatures(OrchardCore.AutoSetup); }AddSetupFeatures扩展方法定义于 OrchardCoreBuilderExtensions.cs用于在默认租户上注册一组用于安装、配置实际租户的特性。需要说明的现状是该特性在源码自带的默认项目OrchardCore.Cms.Web/Program.cs中默认启用源码中直接链式调用了.AddSetupFeatures(OrchardCore.AutoSetup)但在应用模板application templates生成的自定义项目中默认不启用以避免自定义项目出现意外行为。因此基于模板新建的项目需要手动添加上述代码。多实例场景使用分布式锁保证原子安装如果多个 OrchardCore 实例共享同一个数据库同时启动就可能出现并发触发安装的竞态因此需要一个分布式锁来保证自动安装的原子性。此时应在启动文件中同时启用Redis Lock特性与 AutoSetup 特性public void ConfigureServices(IServiceCollection services) { services .AddOrchardCms() .AddSetupFeatures(OrchardCore.Redis.Lock, OrchardCore.AutoSetup); }同时务必通过环境变量或配置文件设置 Redis 连接字符串OrchardCore__OrchardCore_Redis__Configuration: 192.168.99.100:6379,allowAdmintrue分布式锁的源码行为从 AutoSetupMiddleware.cs 可以看到锁获取失败时会抛出TimeoutException信息形如Fails to acquire an auto setup lock for the tenant: {ShellName}成功获取锁后中间件还会通过IShellSettingsManager.LoadSettingsAsync复查该租户是否已被其他实例安装——若已被安装则重新加载 Shell 上下文并返回503。锁名称统一为AUTOSETUP_LOCK具体获取逻辑见 DistributedLockExtensions.cs。值得注意的实现细节若当前注入的锁是本地锁ILocalLock则超时与过期时间直接取TimeSpan.MaxValue只有真正的分布式锁才使用下面配置的超时/过期参数未配置时默认 60 秒。这些行为都被 AutoSetupMiddlewareTests.cs 中的单元测试覆盖如未初始化 Shell 执行安装、安装失败返回 503、锁获取失败抛出超时异常、已初始化 Shell 跳过安装等。可选锁参数锁配置参数可选可通过环境变量或配置文件设置参数说明默认值LockTimeout获取分布式自动安装锁的超时时间毫秒60 秒LockExpiration分布式安装锁的过期时间毫秒60 秒OrchardCore__OrchardCore_AutoSetup__LockOptions__LockTimeout: 10000 OrchardCore__OrchardCore_AutoSetup__LockOptions__LockExpiration: 10000对应配置类为 LockOptions.cs位于AutoSetupOptions.LockOptions之下参见 AutoSetupOptions.cs。安装流程与源码佐证中间件如何按路径触发Startup.cs 的Configure方法只在 Shell 未初始化时挂载安装逻辑并且会先做配置校验若AutoSetupPath为空则直接app.UseMiddlewareAutoSetupMiddleware()——即对所有请求生效命中即触发安装若AutoSetupPath非空则使用app.MapWhen仅在该路径前缀匹配时挂载中间件——即/autosetup、/mytenant/autosetup这类显式触发地址。配置存在但校验失败时会记录错误日志AutoSetup did not start, configuration has following errors: ...并跳过中间件注册。安装上下文如何组装AutoSetupService.cs 负责把TenantSetupOptions转换为SetupContext从ISetupService.GetSetupRecipesAsync()中按RecipeName匹配 Recipe并把管理员账号、数据库提供程序、连接字符串、表前缀、站点名称、时区等写入SetupContext.Properties键来自SetupConstants。对于Default根租户还会同步RequestUrlHost/RequestUrlPrefix。安装完成后根据setupContext.Errors是否为空判定成败并记录对应日志。其余租户的设置何时创建根租户安装成功后中间件会遍历Tenants列表为其他租户调用CreateTenantSettingsAsync——该方法通过 IShellSettingsManager 创建未初始化的ShellSettings写入连接字符串、表前缀、Schema、数据库提供程序、随机Secret、RecipeName、FeatureProfile等并注册到 Shell Host。这样后续每个租户在首次请求时才真正触发各自的安装on-demand实现根租户先装、子租户按需装的渐进式初始化。延伸阅读如需了解空站点Empty Site的手动安装流程与 Setup 模块的更多细节可参考OrchardCore.Setup —— 设置空站点Tenants 模块文档Feature Profiles 说明另外模块的完整单元测试位于 test/OrchardCore.Tests/Modules/OrchardCore.AutoSetup/AutoSetupMiddlewareTests.cs是理解中间件各分支行为跳过安装、执行安装、安装失败、锁获取失败的最佳参考。赞分享CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载相关推荐OrchardCore AutoSetup 无人值守自动安装指南环境变量驱动的一键租户初始化OrchardCore AutoSetup 无人值守自动安装指南环境变量驱动的一键租户初始化 导读 AutoSetup无人值守安装是 OrchardCorCMS后端Web框架如何在现有应用中用 vanilla tRPC 客户端通过 httpBatchLink 完成首次类型安全请求如何在现有应用中用 vanilla tRPC 客户端通过 httpBatchLink 完成首次类型安全请求 如果你的应用不是 React 或 Next.js 环后端RPC框架前端OrchardCore 功能测试实战AutoSetup 无值守建站与 playwright-cli 浏览器自动化验证OrchardCore 功能测试实战AutoSetup 无值守建站与 playwright cli 浏览器自动化验证 本篇指南讲解如何在 OrchardCorCMS后端Web框架上一篇Zettlr 数学公式渲染机制完全指南从 MathTeX 解析到 KaTeX 可视化下一篇WTF Solidity 极简入门第 37 讲ECDSA 数字签名与基于签名的 NFT 白名单发放实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考