Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Windows Azure VIP交换,如何处理自定义web.config值?_Asp.net_Azure_Web Config - Fatal编程技术网

Asp.net Windows Azure VIP交换,如何处理自定义web.config值?

Asp.net Windows Azure VIP交换,如何处理自定义web.config值?,asp.net,azure,web-config,Asp.net,Azure,Web Config,将新部署发布到云服务的暂存或生产环境很容易,但我希望更频繁地使用VIP交换(交换生产和暂存部署)。在我的例子中,每个环境都有不同的web.config值。例如,在登台时,my web.config可能有: <appSettings> <add key="ConnectionStringName" value="StagingConnectionString" /> <add key="WCFServiceUrl" value="http://some

将新部署发布到云服务的暂存或生产环境很容易,但我希望更频繁地使用VIP交换(交换生产和暂存部署)。在我的例子中,每个环境都有不同的web.config值。例如,在登台时,my 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>

发布到暂存或生产时,web.config会根据调试或发布使用正确的值进行转换。但是当涉及到WindowsAzure门户上的VIP交换时,我必须触发交换,然后远程访问每个实例并手动更改这些值(这绝对不是正确的方法)

如何才能更好地处理这种情况?或者有没有一种更好、更灵活的解决方案来处理这些自定义配置值,而不是将它们放在web.config中(尤其是在这种情况下)


提前感谢。

VIP交换顾名思义就是虚拟IP交换。因此,我认为这很简单,可以将DNS指针更改为机器IP,因此我认为不会发生任何配置转换。登台部署应该与生产部署完全匹配


如果您想根据不同的配置测试部署,那么最好在Azure中创建一个新服务,并使用阶段配置在那里部署您的解决方案。一旦满意,在制作的阶段槽中进行新的部署。抽一支烟,做一次交换。

< P>有两种方法可以考虑。

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

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

VIP交换本身只是负载平衡器的重新配置

编辑:下面是我从另一个应用程序中编辑的一些代码(我实际上使用这个逻辑来区分多租户应用程序中的租户,但原理是一样的)

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

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

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


在整个应用程序中,您可以使用
httpContext.Items[“DeploymentContext”]
来识别部署槽并相应地读取正确的配置设置。

使用VIP交换被认为是以web和工作角色将登台升级到生产的“标准”方式。它通过更改Azure路由以将“生产”URL指向“登台”角色实例并将“登台”URL指向“生产”角色实例来实现这种交换

在内部,角色没有意识到这种变化:它完全发生在托管进程的外部

如果你想用这种方式使用VIP交换,你应该考虑改变你的应用程序,要么不知道它的主机环境,要么在它需要知道的时候从它的主机读取信息。


在Azure中安排生产和登台的方式应该是相同的:都是实时配置。该功能用于高可用性部署;它不适合将角色调出到不同的服务(取决于它是否是临时部署)所隐含的测试类型


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

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


您如何在应用程序中使用
WCFServiceUrl
设置?@Tragedian例如,用于生产的WCFServiceUrl是另一个Azure云服务的生产URL。Staging也有一个不同的URL。我在想也许我可以利用Azure表存储(如果可能)将这些配置设置保存在那里,并根据生产或Staging相应地提取它们。不幸的是,据我所知,我认为没有办法确定我是在prod中还是在staging中。您能否详细说明如何检查传入请求中的主机名?尽管WCF URL在配置文件中,但这并不意味着它是静态的,因为那些与Azure云服务相关的URL(特别是在暂存中)可能会更改。到目前为止,我们一直在使用暂存环境作为将新添加的功能暂存到应用程序和错误修复的位置。似乎我们必须重新考虑这一点,即我们创建了一个完全专用于生产部署的云服务,该生产部署可以分阶段进行,而另一个云服务则专用于我们的分阶段部署。至少我从你写的东西中了解到了这一点。我们在同一页吗?是的!这是正确的。一个服务用于生产,一个服务用于暂存。生产阶段的插槽可用于在停机时间最短的情况下提供VIP交换,并可进行烟雾测试,而无需其他任何操作,之后即可购买。因此,从成本角度来看,这是一个平价。谢谢。我会调查的。
<modules runAllManagedModulesForAllRequests="true">
  <add name="DeploymentContextModule"
       type="MyNamespace.DeploymentContextModule, MyNamespace" 
       preCondition="managedHandler" />
</modules>