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?
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
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
naweb.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ę plikweb.base.config
używającweb.[configuration].config
i zapisze go jakoweb.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.
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:
- Tworzenie przekształceń konfiguracyjnych dla konfiguracji (debugowanie, Wydanie, itp.)
- Zmień nazwę pliku
Web.config
naWeb.base.config
- transformacje powinny automatycznie odpowiednio zmienić nazwę (Web.base.Debug.config
, itd.) - 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>
- 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.
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!
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:
- Skonfiguruj Octopus do wdrożenia aplikacji internetowej
- Upewnij się, że twój
Web.Release.config
ma właściwośćBuild Action
ustawioną naContent
, tak jak twój główny plikweb.config
.
![Tutaj wpisz opis obrazka](/images/content/8841075/d68283e684b6d9b142429e9e247dc3d4.png)
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
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>
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