You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过编程方式更新Orchard Core租户的主机名

Orchard Core 代码更新租户Hostname后管理面板不显示的修复方案

我需要通过C#代码给Orchard Core租户添加额外域名,使用IShellSettingsManager修改RequestUrlHost字段后,代码内可以读取到更新后的值,但管理面板的Hostname字段始终显示旧值;直接在管理面板修改该字段却能正常生效。

问题原因

Orchard Core会缓存租户的运行时配置,IShellSettingsManager.SaveSettingsAsync仅负责将修改写入配置文件,不会主动触发缓存刷新,也不会通知系统更新运行时的租户设置,导致管理面板读取的仍是旧缓存数据。

解决方案

在保存设置后,需要调用IShellHost.UpdateShellSettingsAsync刷新运行时配置,同时调用IShellSettingsManager.ReloadSettingsAsync让设置管理器重新读取最新配置,确保后续操作和管理面板都能获取到更新后的值。

修改后的完整代码

using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using OrchardCore.Environment.Shell;
using OrchardDataApi.Services.Interface;

namespace OrchardDataApi.Services
{
    public class TenantService : ITenantService
    {
        private readonly Lazy<IShellSettingsManager> _lazyShellSettingsManager;
        private readonly IShellHost _shellHost;

        private IShellSettingsManager ShellSettingsManager => _lazyShellSettingsManager.Value;

        public TenantService(IHttpContextAccessor httpContextAccessor, IShellHost shellHost)
        {
            _lazyShellSettingsManager = httpContextAccessor.BuildLazyService<IShellSettingsManager>();
            _shellHost = shellHost;
        }

        public async Task<ShellSettings> GetShellSettingsAsync(int websiteId)
        {
            var shellSettings = await ShellSettingsManager.LoadSettingsAsync();
            return shellSettings.SingleOrDefault(x => x.Name == websiteId.ToString());
        }

        public async Task<ShellSettings> UpdateShellSettingsAsync(int websiteId, ShellSettings model)
        {
            // 将修改保存到配置文件
            await ShellSettingsManager.SaveSettingsAsync(model);
            // 通知系统刷新该租户的运行时配置
            await _shellHost.UpdateShellSettingsAsync(model);
            // 重新加载所有租户设置,确保后续读取的是最新值
            await ShellSettingsManager.ReloadSettingsAsync();
            
            return await GetShellSettingsAsync(websiteId);
        }

        public async Task<ShellSettings> AddToRequestUrlHostAsync(int websiteId, string domain)
        {
            var model = await GetShellSettingsAsync(websiteId);

            if (model != null)
            {
                var hosts = model.RequestUrlHosts.ToList();
                if (!hosts.Contains(domain))
                {
                    hosts.Add(domain);
                    model.RequestUrlHost = string.Join(',', hosts);
                    model = await UpdateShellSettingsAsync(websiteId, model);
                }
            }

            return model;
        }
    }
}

关键说明

  • 注入IShellHost是核心,它负责管理所有租户的运行时状态,调用UpdateShellSettingsAsync会触发系统更新该租户的配置缓存。
  • ReloadSettingsAsync会让IShellSettingsManager重新从配置文件读取最新设置,避免后续操作读取旧值。
  • 执行完代码后刷新管理面板,就能看到Hostname字段已更新为添加后的域名列表。

内容的提问来源于stack exchange,提问作者Hillary Trump

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:47:46