Windows Azure VIP Swap,如何处理自定义web.config值?

时间:2013-08-01 13:55:56

标签: asp.net azure web-config

将新部署发布到Cloud Service的临时或生产环境很容易,但我想更频繁地使用VIP交换(交换生产和暂存部署)。就我而言,我为每个环境都有不同的web.config值。例如,在暂存时我的web.config可能有:

<appSettings>
    <add key="ConnectionStringName" value="StagingConnectionString" />
    <add key="WCFServiceUrl" value="http://somelongGUID.cloudapp.net/" />
</appSettings>

......在制作方面,我会:

<appSettings>
    <add key="ConnectionStringName" value="ProductionConnectionString" />
    <add key="WCFServiceUrl" value="http://prodservice.cloudapp.net/" />
</appSettings>

发布到Staging或Production时,将使用基于Debug或Release的正确值转换web.config。但是当谈到Windows Azure门户上的VIP Swap时,我必须触发交换,然后远程进入每个实例并手动更改这些值(这绝对不是正确的方法)。

如何才能更好地应对这种情况?或者是否有一个更好,更灵活的解决方案来处理这些自定义配置值,而不是在web.config中使用它们(特别是在这种情况下)?

提前致谢。

4 个答案:

答案 0 :(得分:5)

使用VIP交换被认为是在Web和辅助角色中促进登台生产的“标准”方式。它通过更改Azure路由以将“生产”URL指向“登台”角色实例并将“登台”URL指向“生产”角色实例来实现此交换。

在内部,角色不知道这种变化:它完全发生在托管过程的外部。

如果您希望以这种方式使用VIP交换,您应该考虑将应用程序更改为不知道其主机环境,或者在需要知道它时从主机读取信息。


在Azure中安排生产和登台的方式,包应该都是相同的:两个实时配置。该功能旨在实现高可用性部署;它不适合将角色调用到不同服务所暗示的那种测试,具体取决于它是否是分段部署。

你最好使用一个单独的角色来执行测试;在使用当前生产部署进行切换之前,只应使用暂存来测试部署是否成功。

答案 1 :(得分:2)

VIP交换顾名思义就是虚拟IP交换。因此,我认为将DNS指针更改为机器IP很简单,因此我认为任何配置转换都不会发生。暂存部署应该在各个意义上与生产部署相匹配。

如果要根据其他配置测试部署,请在Azure中更好地创建新服务,并使用阶段配置在此部署解决方案。一旦满意,就可以在生产阶段插槽中进行新部署。快速吸烟并进行交换。

答案 2 :(得分:1)

您可以考虑几种方法。

对于Web角色,您可以通过检查传入请求URL中的主机名来区分登台和生产。通过从主机名识别上下文,您可以使用不同的配置值。因此,您在web.config中有两个连接字符串,并且您可以根据主机名更改代码以使用适当的连接字符串。

或者,不是通过门户进行VIP交换,而是编写一个工具(如Powershell Cmdlet)来执行此操作,并在执行实际交换的同时触发配置更改。

VIP-swap本身只是Load Balancer的重新配置。

编辑:这是我从不同的应用程序中按摩的一些代码(我实际上使用这种逻辑来区分多租户应用程序中的租户,但原理是相同的。)

public class DeploymentContextModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += OnBegin;
    }

    void OnBegin(object sender, EventArgs e)
    {
        var app = sender as HttpApplication;

        if (app != null)
        {
            var ctx = app.Context;

            if (ctx != null)
            {
                var req = ctx.Request;

                if (req != null)
                {
                    var url = req.Url;

                    var hostName = url.Host;

                    if (!string.IsNullOrEmpty(hostName))
                    {
                        ctx.Items["DeploymentContext"] = 
                            DeploymentContext.Find(hostName);
                    }
                }
            }
        }
    }
}

请注意,您需要提供DeploymentContext.Find(hostname)的实现,以将主机名映射到一些有用的数据。对于生产槽,主机名将与您的云服务相关联。对于暂存插槽,它将是一个guid(没有连字符)。

将其配置为web.config,如下所示:

<modules runAllManagedModulesForAllRequests="true">
  <add name="DeploymentContextModule"
       type="MyNamespace.DeploymentContextModule, MyNamespace" 
       preCondition="managedHandler" />
</modules>

在整个应用中,您可以使用httpContext.Items["DeploymentContext"]来识别部署位置,并相应地阅读正确的配置设置。

答案 3 :(得分:0)

可能值得一看CloudConfigurationManager类,它查看csfg配置设置或web.config。这样您就可以在ServiceConfiguration.Cloud.cscfg文件中定义设置,并在交换VIP之前从Azure门户编辑它们。

http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.cloudconfigurationmanager.aspx