在将Web应用程序部署到Azure时,覆盖web.config的其他部分,而不是appSettings和connectionString

时间:2016-11-29 06:51:04

标签: asp.net azure web-config web.config-transform

将Web应用程序部署到Azure时,您可以通过在要部署的特定Web应用程序的门户中设置这些应用程序来覆盖连接字符串和应用程序设置。有没有办法可以从门户网站覆盖web.config的其他部分。我正在使用Umbraco CMS的插件,该插件需要web.config中的连接字符串,这些字符串不在文件的appSetting部分中。 (他们通常将它们保存在另一个文件中,但我已将它们放在web.config中,因此我希望可以从门户网站中设置它们)

以下是web.config配置部分的示例,其中仅包含我所指的相关部分:

<configuration>
    ...A lot of other web.config stuff
  <imageProcessor>   
    <caching currentCache="AzureBlobCache">
      <caches>
        <cache name="AzureBlobCache" type="ImageProcessor.Web.Plugins.AzureBlobCache.AzureBlobCache, ImageProcessor.Web.Plugins.AzureBlobCache" maxDays="365">
          <settings>
            <!--Azure Cache Provider-->
            <setting key="CachedStorageAccount" value="Azure blob storage key" />
            <setting key="CachedBlobContainer" value="cache" />
            <setting key="UseCachedContainerInUrl" value="false" />
            <setting key="CachedCDNRoot" value="Azure storage account" />
            <setting key="CachedCDNTimeout" value="1000" />
            <setting key="SourceStorageAccount" value="name=Azure storage account" />
            <setting key="SourceBlobContainer" value="media" />
            <setting key="StreamCachedImage" value="false" />
          </settings>
        </cache>
      </caches>
    </caching>
  </imageProcessor>
</configuration>

我想要做的是在上面的缓存部分设置设置键。如果我无法在Azure门户网站appSettings部分直接引用此部分,那么我可以将这些设置作为键放在web.config的appSettings部分中,并从web.config文件的此部分引用它们吗?

我知道我可以使用web.config转换来实现这一点但是这仍然需要我在web.config.release等下检查连接字符串到源代码控制中,我宁愿不这样做。

是否有其他解决方案可以执行我想要的任务? (该解决方案托管在VSTS中,因此我总是可以使用设置键添加另一个构建步骤)这样,它们最终会与构建配置相关联,而不是与源代码控制相关联。

1 个答案:

答案 0 :(得分:0)

您可以将 PowerShell脚本添加为构建定义中的其中一个步骤。如果您使用内联脚本选项,则无需在回购中使用此脚本。

脚本看起来像这样(我在示例中添加了正确的XPath)。

$path = ".\web.config"
$xml = [xml](Get-Content $path)

$dictionary = @{
    CachedCDNTimeout = '9000'    
}

foreach ($key in $dictionary.Keys)
{    
    if (($addKey = $xml.SelectSingleNode("//configuration/imageProcessor/caching/caches/cache/settings/setting[@key = '$key']")))
    {        
        $addKey.SetAttribute('value', $dictionary[$key])
    }
}

$xml.Save($path)

(我只在本地测试过)