Azure云服务-从RoleEnvironment配置会话

时间:2018-11-15 21:55:43

标签: asp.net-mvc azure session web-config azure-cloud-services

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

我们尝试在Application_Startup方法中更改web.config,但会收到错误消息,即启动时拒绝访问web.config,这是有道理的。

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

是否可以设置会话以在应用程序运行时使用其他Redis缓存?

enter image description here

我们得到的错误是“拒绝访问路径'E:\ sitesroot \ 0 \ web.config'。”我读了一篇文章,该文章提供了一些示例,说明了如何使网络服务用户访问web.config作为角色启动过程的一部分,然后执行了该操作,现在我们可以访问该文件,但是现在出现以下错误“无法将配置保存到文件'E:\ sitesroot \ 0 \ web.config'。” < / p>

1 个答案:

答案 0 :(得分:0)

我们最终能够使用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
    }    
}