我们的应用程序作为Azure中的Cloud Service托管,我们在ServiceConfiguration文件中定义了所有连接字符串和其他类似连接的设置。我们还使用Redis缓存作为会话状态存储。我们试图在ServiceConfig中指定Redis Cache主机和访问密钥,然后根据这些位的位置将这些值用于部署。问题是会话是在web.config中定义的,我们无法将RoleEnvironment设置拉入web.config。
我们尝试在Application_Startup方法中更改web.config,但会收到错误消息,即启动时拒绝访问web.config,这是有道理的。
我们真的不想编写部署脚本来授予网络服务用户访问web.config的权限。
是否可以设置会话以在应用程序运行时使用其他Redis缓存?
我们得到的错误是“拒绝访问路径'E:\ sitesroot \ 0 \ web.config'。”我读了一篇文章,该文章提供了一些示例,说明了如何使网络服务用户访问web.config作为角色启动过程的一部分,然后执行了该操作,现在我们可以访问该文件,但是现在出现以下错误“无法将配置保存到文件'E:\ sitesroot \ 0 \ web.config'。” < / p>
答案 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
}
}