Azure 云服务 - 从 RoleEnvironment 配置会话

Azure Cloud Service - Configure Session from RoleEnvironment

我们的应用程序作为云服务托管在 Azure 中,我们在 ServiceConfiguration 文件中定义了所有连接字符串和其他类似连接的设置。我们还使用 Redis 缓存作为会话状态存储。我们试图在 ServiceConfig 中指定 Redis 缓存主机和访问密钥,然后根据位的位置使用这些值进行部署。问题是会话是在 web.config 中定义的,我们无法将 RoleEnvironment 设置拉入 web.config。

我们尝试更改 Application_Startup 方法中的 web.config,但在启动时出现错误,表明对 web.config 的访问被拒绝,这是有道理的。

我们真的不想编写部署脚本来让网络服务用户访问 web.config。

有没有办法设置会话以在应用程序运行时使用不同的 Redis 缓存?

我们收到的错误是 "Access to the path 'E:\sitesroot[=23=]\web.config' is denied'. I read an article that gave some examples on how to give the Network Service user access to the web.config as part of the role starting process and did that and then now we have access to the file but now get the following error "无法将配置保存到文件 'E:\sitesroot[=24=]\web.config'。"

我们最终能够在 WebRole.OnStart 方法中使用 ServerManager API 解决这个问题。我们做了这样的事情:

using (var server = new ServerManager())
{    
    try
    {
        Site site = server.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"];
        string physicalPath = site.Applications["/"].VirtualDirectories["/"].PhysicalPath;
        string webConfigPath = Path.Combine(physicalPath, "web.config");

        var doc = System.Xml.Linq.XDocument.Load(webConfigPath);

        var redisCacheProviderSettings = doc.Descendants("sessionState").Single().Descendants("providers").Single().Descendants("add").Single();

        redisCacheProviderSettings.SetAttributeValue("host", RoleEnvironment.GetConfigurationSettingValue("SessionRedisCacheHost"));
        redisCacheProviderSettings.SetAttributeValue("accessKey", RoleEnvironment.GetConfigurationSettingValue("SessionRedisCacheAccessKey"));
        redisCacheProviderSettings.SetAttributeValue("ssl", "true");
        redisCacheProviderSettings.SetAttributeValue("throwOnError", "false");

        doc.Save(webConfigPath);
    }
    catch (Exception ex)
    {
        // Log error
    }    
}