2015-07-09 2 views
4

Мы создаем веб-приложение с использованием новой платформы ASP.NET 5. Я настраиваю средства автоматизации сборки и развертывания, и я хочу иметь возможность изменять параметры приложения во время развертывания (например, изменять URL-адрес веб-сервиса). В ASP.NET 5 у нас больше нет файлов web.config, а только новые файлы конфигурации json. Есть ли механизм в ASP.NET 5, аналогичный преобразованию web.config в предыдущих версиях ASP.NET?Преобразование конфигурационного файла в ASP.NET 5

ответ

3

Вам не нужны конфигурационные преобразования в ASP.NET 5, так как у него есть встроенная поддержка цепочечных источников конфигурации. Например, возьмем this sample:

public class Startup 
{ 
    private readonly IConfiguration _configuration; 

    public Startup(IApplicationEnvironment appEnv, IHostingEnvironment env) 
    { 
     _configuration = new ConfigurationBuilder(appEnv.ApplicationBasePath) 
      .AddJsonFile("config.json") 
      .AddEnvironmentVariables() 
      .Build(); 
    } 

    // ... 
} 

Мы добавляем два источника конфигурации и создания конфигурации НАШИХ из них. если я попрошу ключ конфигурации, он попытается получить значение для этого ключа, посмотрев на источники от последнего до первого порядка. В вышеприведенном случае я могу работать с файлом config.json во время разработки, и я могу использовать его, предоставляя правильную конфигурацию из переменных среды.

Дополнительную информацию смотрите на странице the Configuration docs.

+1

спасибо! Я уже смотрел ConfigurationBuilder, но ваша мысль об обратном порядке прояснила все. –

0

Как указано в @tugberk, вместо этого вы можете использовать переменные окружения, что является гораздо лучшим способом справиться с этой ситуацией. Если вы работаете в среде разработки и хотите хранить пароли или строки подключения, вы также можете использовать секреты пользователей, чтобы добавить их. В конце концов, что вы можете все еще использовать среды специфические конфигурационные файлы, как это (Это ASP.NET 5 Beta 5 Sample):

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(
    applicationEnvironment.ApplicationBasePath); 

// Add configuration from the config.json file. 
configurationBuilder.AddJsonFile("config.json"); 

// Add configuration from an optional config.development.json, config.staging.json or 
// config.production.json file, depending on the environment. These settings override the ones in the 
// config.json file. 
configurationBuilder.AddJsonFile($"config.{hostingEnvironment.EnvironmentName}.json", optional: true); 

if (hostingEnvironment.IsEnvironment(EnvironmentName.Development)) 
{ 
    // This reads the configuration keys from the secret store. This allows you to store connection strings 
    // and other sensitive settings on your development environment, so you don't have to check them into 
    // your source control provider. See http://go.microsoft.com/fwlink/?LinkID=532709 and 
    // http://docs.asp.net/en/latest/security/app-secrets.html 
    configurationBuilder.AddUserSecrets(); 
} 

// Add configuration specific to the Development, Staging or Production environments. This config can 
// be stored on the machine being deployed to or if you are using Azure, in the cloud. These settings 
// override the ones in all of the above config files. 
// Note: To set environment variables for debugging navigate to: 
// Project Properties -> Debug Tab -> Environment Variables 
// Note: To get environment variables for the machine use the following command in PowerShell: 
// $env:[VARIABLE_NAME] 
// Note: To set environment variables for the machine use the following command in PowerShell: 
// $env:[VARIABLE_NAME]="[VARIABLE_VALUE]" 
// Note: Environment variables use a colon separator e.g. You can override the site title by creating a 
// variable named AppSettings:SiteTitle. See 
// http://docs.asp.net/en/latest/security/app-secrets.html 
configurationBuilder.AddEnvironmentVariables(); 

IConfiguration configuration = configurationBuilder.Build(); 
4

Я знаю, что web.configs на самом деле не поддерживаются, но они все еще используются в ASP.Net под IIS.

У меня было желание применить преобразования, а также я хотел контролировать переменную окружения от конфигурации следующим образом:

<aspNetCore> 
    <environmentVariables xdt:Transform="Replace"> 
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" /> 
    </environmentVariables> 
</aspNetCore> 

Если вы действительно хотите, чтобы превратить их в ядра ASP.Net/5 вы можете использовать следующий метод:

  1. Добавить в много различных web.config преобразования файлов, как вы хотите, чтобы ваш проекта. Например, вы можете добавить Web.Development.config, Web.Staging.config и Web.Production.config и т. Д. Назовите их, как вам нравится.

  2. Измените файл project.json для вывода файлов, добавив эту строку в publishoptions прямо ниже текущей строки web.config: «. Интернет * конфигурации»

  3. Вход Создать профиль и публикации изменить свой Powershell скрипт для вашего профиля публикации (находится в Project Web \ Свойства \ PublishProperties \ ProfileName-publish.ps1) добавить следующие модификации:

Добавьте эту функцию выше попытке поймать (я нашел эту функцию здесь Web.Config transforms outside of Microsoft MSBuild?, немного модифицировано.):

function XmlDocTransform($xml, $xdt) 
{ 
    if (!$xml -or !(Test-Path -path $xml -PathType Leaf)) { 
     throw "File not found. $xml"; 
    } 
    if (!$xdt -or !(Test-Path -path $xdt -PathType Leaf)) { 
     throw "File not found. $xdt"; 
    } 

    "Transforming $xml using $xdt"; 

    $scriptPath = (Get-Variable MyInvocation -Scope 1).Value.InvocationName | split-path -parent 
    #C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll 

    Add-Type -LiteralPath "${Env:ProgramFiles(x86)}\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll" 

    $xmldoc = New-Object Microsoft.Web.XmlTransform.XmlTransformableDocument; 
    $xmldoc.PreserveWhitespace = $true 
    $xmldoc.Load($xml); 

    $transf = New-Object Microsoft.Web.XmlTransform.XmlTransformation($xdt); 
    if ($transf.Apply($xmldoc) -eq $false) 
    { 
     throw "Transformation failed." 
    } 
    $xmldoc.Save($xml); 
} 

Добавьте эти строки ВЫШЕ в Publish-сети САШ, вызов:

$xdtFiles = Get-ChildItem $packOutput | Where-Object {$_.Name -match "^web\..*\.config$"}; 
$webConfig = $packOutput + "web.config"; 
foreach($xdtFile in $xdtFiles) { 

    XmlDocTransform -xml $webConfig -xdt "$packOutput$xdtFile" 
} 
+0

Мне досадно, что они добавили эти обязательные переменные ASPNETCORE_ENVIRONMENT без какого-либо простого способа контролировать их на основе профиля публикации! – Sprintstar

+1

Похоже, что последняя строка в методе XmlDocTransform неверна. Он должен быть $ xmldoc.Save ($ xml); работать. Кроме того, это действительно удобный скрипт, хороший! –

+0

@Svein Fidjestøl Svein, это на самом деле то, как я хотел сохранить файлы. Как file.environment.config. Мы используем развертывание octopus для развертывания наших файлов, и в рамках нашего процесса развертывания мы создаем правильную конфигурацию. Мне нравится ваше изменение как альтернатива другим людям, которые не хотели, чтобы это работало таким образом, но это было сделано специально. :) – SpaceGhost440