Konfiguracja www nie działa

W aplikacji. NET MVC 3.0 mam następującą konfigurację w appSettings:

Www.config

<appSettings>
<add key="SMTPHost" value="mail.domain.com"/>
    <add key="SMTPUsername" value="[email protected]"/>
    <add key="SMTPPort" value="25"/>
    <add key="SMTPPwd" value="mypassword"/>
    <add key="EmailFrom" value="[email protected]"/>
</appSettings>

Do debugowania mam zdefiniowaną następującą transformację konfiguracyjną:

Www.Debugowanie.config

<appSettings>
    <add  key="SMTPPort" value="58" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

I uruchamiam aplikację w trybie debugowania, ale mój port SMTP nadal pobiera wartość z web.config, a nie web.Debug.config.

Czy ktoś może zasugerować, co może być nie tak w tej konfiguracji?

Author: Matt, 2012-01-12

7 answers

Www.transformacje config są stosowane tylko w ramach operacji publikowania.

Jeśli chcesz to zrobić w ramach app.config operacji budowania, możesz użyć wtyczki Slowcheetah-XML Transforms Visual Studio:

Http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

 132
Author: devdigital,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 15:57:58

Visual Studio (2010 - 2017) czy niestety Nie bezpośrednio obsługuje go podczas debugowania, jest przeznaczony tylko do publikowania - nawet z rozszerzeniem SlowCheetah (zaznaczona odpowiedź) nie działa dla mnie (tylko dla projektów korzystających z aplikacji.config zamiast web.config).

Uwaga , że istnieje obejście opisane w codeproject .

Opisuje jak zmodyfikować .plik msproj do nadpisania bieżącego www.config by the transformed version.

Najpierw opiszę to obejście jako Opcja 1 , ale ostatnio dowiedziałem się innej Opcja 2 , która jest łatwiejsza w użyciu (więc możesz przewiń w dół do opcji 2 bezpośrednio, jeśli chcesz):


Opcja 1: dodałem instrukcje zaczerpnięte z oryginalnego artykułu codeproject (patrz link powyżej), ponieważ zrzutów ekranu już nie ma i nie chcę stracić całego informacje:

VS.Net nie zmienia się podczas tworzenia, a jedynie debuguje lokalne środowisko. Ale jest kilka kroków, które możesz zrobić, aby to się stało, jeśli chcesz.

  • najpierw Utwórz konfiguracje, które chcesz w VS.Net , zakładając, że domyślne debugowanie i wydanie nie wystarczą do tego, co próbujesz osiągnąć.
  • Kliknij prawym przyciskiem myszy na web.config i wybierz Dodaj Config Transforms - spowoduje to utworzenie zależnej konfiguracja transformacji dla każdej konfiguracji zdefiniowanej.
  • teraz możesz zmienić nazwę swojego web.config na web.base.config.
  • dodaj web.config do swojego projektu. Nie ma znaczenia, co w nim jest, ponieważ będzie nadpisywany za każdym razem, gdy robimy build, ale chcemy, aby był częścią projektu, więc VS.Net nie daje nam wyskakującego okna "Twój projekt nie jest skonfigurowany do debugowania".
  • Edytuj swój .csproj plik projektu i dodaj następujące zadanie {[6] } do AfterBuild cel. Tutaj możesz zobaczyć, że przekształcę plik web.base.config używając web.[configuration].config i zapisze go jako web.config. Aby uzyskać szczegółowe informacje, Sprawdź to Microsoft Q&A, A aby uzyskać instrukcje jak rozszerzyć kompilację, zajrzyj tam .

Opcja 2:

Na podstawietej odpowiedzi , opracowałem prostą aplikację konsolową TransformConfig.exe (w składni C # 6.0):

using System;
using System.Linq;
using Microsoft.Web.XmlTransform;

namespace TransformConfig
{

  class Program
  {
    static int Main(string[] args)
    {
        var myDocumentsFolder = $@"C:\Users\{Environment.UserName}\Documents";
        var myVsProjects = $@"{myDocumentsFolder}\Visual Studio 2015\Projects";

        string srcConfigFileName = "Web.config";
        string tgtConfigFileName = srcConfigFileName;
        string transformFileName = "Web.Debug.config";
        string basePath = myVsProjects + @"\";
        try
        {

            var numArgs = args?.Count() ?? 0;
            if (numArgs == 0 || args.Any(x=>x=="/?"))
            {
                Console.WriteLine("\nTransformConfig - Usage:");
                Console.WriteLine("\tTransformConfig.exe /d:tgtConfigFileName [/t:transformFileName [/s:srcConfigFileName][/b:basePath]]");
                Console.WriteLine($"\nIf 'basePath' is just a directory name, '{basePath}' is preceeded.");
                Console.WriteLine("\nTransformConfig - Example (inside PostBuild event):");
                Console.WriteLine("\t\"c:\\Tools\\TransformConfig.exe\"  /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:\"$(ProjectDir)\\\"");
                Environment.ExitCode = 1;
                return 1;
            }

            foreach (var a in args)
            {
                var param = a.Trim().Substring(3).TrimStart();
                switch (a.TrimStart().Substring(0,2).ToLowerInvariant())
                {
                    case "/d":
                        tgtConfigFileName = param ?? tgtConfigFileName;
                        break;
                    case "/t":
                        transformFileName = param ?? transformFileName;
                        break;
                    case "/b":
                        var isPath = (param ?? "").Contains("\\");
                        basePath = (isPath == false)
                                    ? $@"{myVsProjects}\" + param ?? ""
                                    : param;
                        break;
                    case "/s":
                        srcConfigFileName = param ?? srcConfigFileName;
                        break;
                    default:
                        break;
                }
            }
            basePath = System.IO.Path.GetFullPath(basePath);
            if (!basePath.EndsWith("\\")) basePath += "\\";
            if (tgtConfigFileName != srcConfigFileName)
            {
                System.IO.File.Copy(basePath + srcConfigFileName,
                                     basePath + tgtConfigFileName, true);
            }
            TransformConfig(basePath + tgtConfigFileName, basePath + transformFileName);
            Console.WriteLine($"TransformConfig - transformed '{basePath + tgtConfigFileName}' successfully using '{transformFileName}'.");
            Environment.ExitCode = 0;
            return 0;
        }
        catch (Exception ex)
        {
            var msg = $"{ex.Message}\nParameters:\n/d:{tgtConfigFileName}\n/t:{transformFileName}\n/s:{srcConfigFileName}\n/b:{basePath}";
            Console.WriteLine($"TransformConfig - Exception occurred: {msg}");
            Console.WriteLine($"TransformConfig - Processing aborted.");
            Environment.ExitCode = 2;
            return 2;
        }
    }

    public static void TransformConfig(string configFileName, string transformFileName)
    {
        var document = new XmlTransformableDocument();
        document.PreserveWhitespace = true;
        document.Load(configFileName);

        var transformation = new XmlTransformation(transformFileName);
        if (!transformation.Apply(document))
        {
            throw new Exception("Transformation Failed");
        }
        document.Save(configFileName);
    }

  }
}

Upewnij się, że dodajesz DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll" jako odniesienie (ten przykład dotyczy VS 2015, dla starszych wersji zastąp v14.0 w ścieżce odpowiednim numerem wersji, np. v11.0).

Dla Visual Studio 2017, schemat nazewnictwa ścieżki został zmieniony: na przykład dla wersji enterprise znajduje się tutaj: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web.
Zakładam, że dla wersji professional należy zastąpić Enterprise w ścieżce przez Professional. Jeśli używasz wersji podglądu, dodatkowo zastąp 2017 przez Preview.

Skompilować i umieścić .plik exe do katalogu, np. C:\MyTools\.

Sposób użycia: Możesz go użyć w zdarzeniu post build (we właściwościach projektu wybierz Build Events , a następnie Edytuj wiersz poleceń post-build event ). Parametry wiersza poleceń są (przykład):

"C:\MyTools\TransformConfig.Exe " / D: Web.config/T: Web.$(ConfigurationName).config/s: Web.Szablon.config / b: "$(ProjectDir)\ "

Tzn. najpierw nazwa pliku konfiguracyjnego, a następnie przez plik konfiguracyjny przekształć, a następnie opcjonalną konfigurację szablonu, a następnie ścieżkę do projektu zawierającego oba pliki.

Dodałem opcjonalny parametr konfiguracyjny szablonu, ponieważ w przeciwnym razie oryginalna pełna konfiguracja zostałaby nadpisana przez transformację, czego można uniknąć, dostarczając szablon.

Utwórz szablon po prostu kopiując oryginalną stronę.config i nazwij go Web.Szablon.config.

Uwaga:

  • Jeśli wolisz, możesz również skopiować plik TransformConfig.exe do ścieżki Visual Studio, o której mowa powyżej, gdzie znajduje się Microsoft.Web.XmlTransform.dll i odnieść się do niego we wszystkich projektach, w których musisz przekształcić swoje konfiguracje.

  • Dla tych z Was, którzy zastanawiają się, dlaczego dodałem Environment.ExitCode = x; assignments: samo zwrócenie int z Main nie pomogło w zdarzeniu build. Zobacz szczegóły tutaj.

  • Jeśli publikujesz swój projekt i używasz Www.Szablon.config, upewnij się, że przed publikacją wykonałeś Przebuduj na swoim rozwiązaniu z odpowiednią konfiguracją (Zwykle Release). Powodem jest to, że sieć.Config jest nadpisywany podczas debugowania i w przeciwnym razie możesz przekształcić niewłaściwy plik.

 21
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 07:30:20

Odpowiedź na twoje pytanie nie jest prosta, ponieważ stanowi problem - jeśli chcesz przekształcić sieć.config with Web.debugowanie.config-gdzie powinien być przechowywany efekt transformacji? W Sieci.konfigurację? To nadpisałoby plik źródłowy transformacji! Prawdopodobnie dlatego Visual Studio nie dokonuje transformacji podczas kompilacji.

Poprzednia odpowiedź jest poprawna, ale możesz chcieć je wymieszać, aby mieć ogólne rozwiązanie, które działa, gdy faktycznie zmienisz konfigurację aktywnego rozwiązania z debugowanie do wydania itp. Oto proste rozwiązanie:

  1. Tworzenie przekształceń konfiguracyjnych dla konfiguracji (debugowanie, Wydanie, itp.)
  2. Zmień nazwę pliku Web.config na Web.base.config - transformacje powinny automatycznie odpowiednio zmienić nazwę (Web.base.Debug.config, itd.)
  3. Dodaj następujący transformWebConfig.plik proj XML do folderu projektu:
<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" DefaultTargets="TransformWebConfig" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="TransformWebConfig">
    <TransformXml Source="Web.base.config" Transform="Web.base.$(CurrentConfig).config" Destination="Web.config" />
  </Target>
</Project>
  1. przejdź do właściwości projektu, wybierz Build Events i dodaj następującą treść do Post-build event command line :
@if exist "%ProgramFiles(x86)%\MSBuild\12.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\12.0\bin;%PATH%
msbuild $(ProjectDir)transformWebConfig.proj /t:TransformWebConfig /p:CurrentConfig=$(ConfigurationName) /p:TargetProjectName=$(TargetPath)

Teraz, kiedy budujesz swoje rozwiązanie, sieć.plik konfiguracyjny zostanie utworzony z poprawnymi transformacjami dla aktywnej konfiguracji.

 20
Author: komsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 15:05:58

Odpowiedź na twoje natychmiastowe pytanie - Wyjaśnienie jest takie, że transformacja jest stosowana przy publikowaniu, a nie przy budowaniu.

Myślę jednak, że nie oferuje on rozwiązania, jak osiągnąć to, co chcesz zrobić.

Od kilku dni zmagam się z tym problemem, szukając sposobu na utrzymanie sieci.config wyczyść i ustaw wszystkie klucze, które różnią się w zależności od środowiska w odpowiednich plikach transformacji. Mój wniosek jest taki, że najprostszym i najbardziej stabilnym rozwiązaniem jest aby użyć wartości debugowania w oryginalnym web.config, w ten sposób są one zawsze obecne podczas wykonywania debugowania w Visual Studio.

Następnie twórz transformacje dla różnych środowisk, które chcesz opublikować - testowanie, integracja, produkcja-cokolwiek masz. Wbudowana funkcjonalność do przekształcania sieci.wystarczy do tego Pliki konfiguracyjne podczas publikowania. Nie ma potrzeby SlowCheetah lub edycji zdarzeń budowania ani plików projektu. Jeśli masz tylko projekty internetowe, które są.

Jeśli chcesz, możesz też mieć sieć.debugowanie.plik konfiguracyjny w Twoim rozwiązaniu, aby zachować osobny plik ze wszystkimi wartościami odnoszącymi się do środowiska programistycznego. Pamiętaj, aby dodać komentarz, że wartości nie są stosowane podczas uruchamiania w Visual Studio, na wypadek, gdyby ktoś inny próbował użyć go do tego celu!

 4
Author: Carolina Persson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 08:39:08

Użyj Octopus Deploy (edycja społecznościowa jest darmowa) i pozwól jej przekształcić web.config dla Ciebie. Kroki:

  1. Skonfiguruj Octopus do wdrożenia aplikacji internetowej
  2. Upewnij się, że twój Web.Release.config ma właściwość Build Action ustawioną na Content, tak jak twój główny plik web.config.
To jest to! Octopus zrobi resztę bez żadnej specjalnej konfiguracji. Domyślna implementacja witryny sieci Web IIS zrobi to po wyjęciu z pudełka:Tutaj wpisz opis obrazka
 1
Author: Matt Kocaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-22 06:27:36

Najwyraźniej jest rozszerzenie dla Visual Studio 2015

Https://visualstudiogallery.msdn.microsoft.com/05bb50e3-c971-4613-9379-acae2cfe6f9e

Ten pakiet umożliwia przekształcenie aplikacji.config lub inny plik XML oparty na konfiguracji build

 0
Author: Amir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-18 10:40:48

Ostatnio miałem ten sam problem ze starszą siecią.Config złożony w oparciu o. NET Framework 2.0. Rozwiązaniem było po prostu usunięcie sieci.Config ' s namespace (xmlns attibute in configuration root node):

Przed: <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

Po: <configuration>

 0
Author: rneto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 16:43:06