Czytając te dwa pytania / odpowiedzi, udało mi się uruchomić aplikację Asp.net 5 na serwerze IIS 8.5.
Asp.net vNext wczesna wersja beta publikuje w usługach IIS na serwerze Windows
Jak skonfigurować aplikację MVC6 do pracy z usługami IIS?
Problem polega na tym, że aplikacja internetowa nadal używa env.EnvironmentName
wartości, Development
nawet gdy jest uruchomiona w usługach IIS.
Chcę też uruchomić dwie wersje tej samej sieci Web (etapowa, produkcyjna) na tym samym serwerze, więc potrzebuję metody ustawiania zmiennej osobno dla każdej sieci Web.
Jak to zrobić?
Properties\launchSettings.json
do symulowania innego środowiska do debugowania w programie Visual Studio.Odpowiedzi:
Ta odpowiedź została pierwotnie napisana dla ASP.NET Core RC1. W RC2 ASP.NET Core przeniesiono z ogólnego modułu obsługi httpPlafrom do specyficznego dla aspnetCore. Zwróć uwagę, że krok 3 zależy od używanej wersji ASP.NET Core.
Okazuje się, że zmienne środowiskowe dla projektów ASP.NET Core można ustawić bez konieczności ustawiania zmiennych środowiskowych dla użytkownika lub konieczności tworzenia wielu wpisów poleceń.
Configuration Editor
.Configuration Editor
system.webServer/aspNetCore
(RC2 i RTM) lubsystem.webServer/httpPlatform
(RC1) wSection
comboboxApplicationhost.config ...
wFrom
combobox.enviromentVariables
element, wybierz'environmentVariables' element
, a następnieEdit Items
.W ten sposób nie musisz tworzyć specjalnych użytkowników dla swojej puli ani tworzyć dodatkowych wpisów poleceń w
project.json
. Ponadto dodanie specjalnych poleceń dla każdego środowiska przerywa „buduj raz, wdrażaj wiele razy”, ponieważ będziesz musiał wywoływaćdnu publish
osobno dla każdego środowiska, zamiast raz publikować i wdrażać wynikowy artefakt wiele razy.Zaktualizowano dla RC2 i RTM dzięki Markowi G i tredderowi.
źródło
system.webServer/aspNetCore
zamiast tego użyłem .Zaktualizuj plik web.config za pomocą sekcji <environmentVariables> w obszarze <aspNetCore>
Lub, aby uniknąć utraty tego ustawienia podczas nadpisywania pliku web.config, wprowadź podobne zmiany w pliku applicationHost.config, określając lokalizację witryny zgodnie z sugestią @NickAb.
źródło
Target configuration object '/system.webServer/aspNetCore/environmentVariables/environmentVariable is not found ...
Normalnie, aby ustawić jakąś zmienną, napisałbym coś takiego:Set-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging
czego mi brakuje?appcmd
zamiast tego użyłem .Set-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Edycja: od wersji RC2 i RTM ta rada jest nieaktualna. Najlepszym sposobem, jaki znalazłem w tej wersji, jest edycja następujących sekcji web.config w usługach IIS dla każdego środowiska:
system.webServer/aspNetCore
:Edytuj wpis environmentVariable i dodaj ustawienie zmiennej środowiskowej:
ASPNETCORE_ENVIRONMENT
:< Your environment name >
Jako alternatywę dla podejścia drpdrp możesz wykonać następujące czynności:
W pliku project.json dodaj polecenia, które przekazują zmienną ASPNET_ENV bezpośrednio do Kestrel:
Podczas publikowania użyj
--iis-command
opcji, aby określić środowisko:Uważam, że to podejście jest mniej inwazyjne niż tworzenie dodatkowych użytkowników IIS.
źródło
Mam swoje aplikacje internetowe (PRODUKCJA, STAGING, TEST) hostowane na serwerze internetowym IIS. Nie można było więc polegać na zmiennej środowiskowej operatywnej systemu ASPNETCORE_ENVIRONMENT, ponieważ ustawienie jej na określoną wartość (na przykład STAGING) ma wpływ na inne aplikacje.
Aby obejść ten problem, zdefiniowałem niestandardowy plik (envsettings.json) w moim rozwiązaniu Visualstudio:
o następującej treści:
Następnie, w oparciu o typ mojej aplikacji (produkcja, staging lub test), ustawiam ten plik odpowiednio: zakładając, że wdrażam aplikację TEST, będę miał:
Następnie w pliku Program.cs pobierz tę wartość, a następnie ustaw środowisko webHostBuildera:
Pamiętaj, aby dołączyć plik envsettings.json do pliku PublishedOptions (project.json):
Dzięki temu rozwiązaniu mogę swobodnie korzystać z aplikacji ASP.NET CORE hostowanej w tych samych usługach IIS, niezależnie od wartości zmiennej środowiska.
źródło
Po obszernym googlowaniu znalazłem działające rozwiązanie, które składa się z dwóch kroków.
Pierwszym krokiem jest ustawienie zmiennej środowiskowej systemu ASPNET_ENV na produkcję i ponowne uruchomienie systemu Windows Server . Następnie wszystkie aplikacje internetowe otrzymują wartość „Produkcja” jako EnvironmentName.
Drugi krok (włączenie wartości „Staging” dla pomostowej strony internetowej) był raczej trudniejszy do wykonania prawidłowego działania, ale oto jest:
Teraz w sieci Web Staging powinna mieć wartość EnvironmentName ustawioną na „Staging”.
Aktualizacja: W systemie Windows 7+ jest polecenie, które może ustawić zmienne środowiskowe z wiersza poleceń CMD również dla określonego użytkownika. To wyświetla pomoc oraz próbki:
źródło
Alternatywnie można przekazać żądane
ASPNETCORE_ENVIRONMENT
do polecenia dotnet Publishing jako argument przy użyciu:na przykład:
Spowoduje to wygenerowanie pliku web.config z odpowiednim środowiskiem określonym dla Twojego projektu:
źródło
Oprócz opcji wymienionych powyżej istnieje kilka innych rozwiązań, które dobrze sprawdzają się w przypadku wdrożeń automatycznych lub wymagają mniejszej liczby zmian w konfiguracji.
1. Modyfikacja pliku projektu (.CsProj)
MSBuild obsługuje
EnvironmentName
Właściwość, która może pomóc ustawić odpowiednią zmienną środowiskową zgodnie ze środowiskiem, które chcesz wdrożyć. Nazwa środowiska zostanie dodana w pliku web.config podczas fazy publikowania.Po prostu otwórz plik projektu (* .csProj) i dodaj następujący kod XML.
Powyższy kod dodałby nazwę środowiska, taką jak
Development
dla konfiguracji debugowania lub jeśli nie określono żadnej konfiguracji. W przypadku każdej innej konfiguracji nazwa środowiska będzie znajdować sięProduction
w wygenerowanym pliku web.config. Więcej szczegółów tutaj2. Dodanie właściwości EnvironmentName w profilach publikowania.
<EnvironmentName>
Właściwość możemy również dodać w profilu publikacji. Otwórz plik profilu publikowania, który znajduje się wProperties/PublishProfiles/{profilename.pubxml}
Spowoduje to ustawienie nazwy środowiska w pliku web.config po opublikowaniu projektu. Więcej szczegółów tutaj3. Opcje wiersza polecenia używające dotnet Publishing
Dodatkowo możemy przekazać tę właściwość
EnvironmentName
jako opcję wiersza poleceń dodotnet publish
polecenia. Następujące polecenie zawierałoby zmienną środowiskową, taką jakDevelopment
w pliku web.config.dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
źródło
Aby rozszerzyć odpowiedź @ tredder, możesz zmienić zmienne environmentVariables za pomocą
appcmd
Inscenizacja
%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST
Produkcja
%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST
źródło
Podobnie jak w przypadku innych odpowiedzi, chciałem upewnić się, że moje ustawienie środowiska ASP.NET Core 2,1 będzie zachowywane we wszystkich wdrożeniach, ale również będzie stosowane tylko do określonej witryny.
Zgodnie z dokumentacją Microsoftu można ustawić zmienną środowiskową w puli aplikacji za pomocą następującego polecenia PowerShell w IIS 10:
Niestety nadal muszę korzystać z usług IIS 8.5 i pomyślałem, że nie miałem szczęścia. Jednak nadal można uruchomić prosty skrypt programu PowerShell, aby ustawić wartość zmiennej środowiskowej specyficznej dla witryny dla ASPNETCORE_ENVIRONMENT:
źródło
Co musisz wiedzieć w jednym miejscu:
ASPNETCORE_
.:
jako separatora. Jeśli platforma nie zezwala na dwukropki w kluczach zmiennych środowiskowych, użyj__
zamiast tego.ApplicationHost.config
. Użycie edytora konfiguracji usług IIS spowoduje, że dane wejściowe zostaną zapisane w aplikacjiWeb.config
- i zostaną nadpisane przy następnym wdrożeniu!W przypadku modyfikowania
ApplicationHost.config
chcesz użyć,appcmd.exe
aby upewnić się, że modyfikacje są spójne. Przykład:%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /+"environmentVariables.[name='ASPNETCORE_AWS:Region',value='eu-central-1']" /commit:site
Znaki, które nie są bezpieczne dla adresu URL, mogą zostać zmienione jako Unicode, jak w
%u007b
przypadku lewego nawiasu klamrowego.%systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /-"environmentVariables.[name='ASPNETCORE_MyKey',value='value-to-be-removed']" /commit:site
.źródło
/commit:site
zmianami są zapisywane w pliku web.config, aby zapisać je w tymApplicationHost.config
należy użyć/commit:apphost
-section:system.webServer/aspNetCore /-"environmentVariables.
(z minusem do usunięcia zmiennej środowiskowej) nie można wykonać podczas potoku wydania platformy Azure. Błąd jesthresult:80070032, message:Command execution failed
. Jednakclear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:site
działa dobrze. Czyści całą sekcję aspNetCore dla witryny sieci Web, ale nie stanowi problemu, ponieważ jest sparametryzowana podczas wydania.Rozwiązanie @tredder z możliwością edycji applicationHost.config to takie, które działa, jeśli masz kilka różnych aplikacji znajdujących się w katalogach wirtualnych w usługach IIS.
Mój przypadek to:
Przechodzenie do applicationHost.config i ręczne tworzenie węzłów w ten sposób:
<location path="XXX/app"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location> <location path="XXX/api"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location>
i ponowne uruchomienie usług IIS wykonało zadanie.
źródło
Wiem, że udzielono wielu odpowiedzi, ale w moim przypadku dodałem wersje web. {Environment} .config w moim projekcie i podczas publikowania dla określonego środowiska wartość jest zastępowana.
Na przykład dla Staging (web.Staging.config)
W przypadku wydania lub produkcji zrobię to (web.Release.config)
Następnie podczas publikacji wybiorę lub ustawię nazwę środowiska. I to zastąpi wartość środowiska w ostatecznym pliku web.config.
źródło
Aby uzyskać szczegółowe informacje o błędzie, musiałem dodać
ASPNETCORE_ENVIRONMENT
zmienną środowiskową dla odpowiedniej puli aplikacjisystem.applicationHost/applicationPools
.Uwaga: aplikacja internetowa w moim przypadku była
ASP.NET Core 2
hostowana na serwerzeIIS 10
. Można to zrobić przezConfiguration Editor
inIIS Manager
(zobacz Edycja kolekcji za pomocą Edytora konfiguracji, aby dowiedzieć się, gdzie znaleźć ten edytorIIS Manager
).źródło
Utworzyłem repozytorium do publikowania IIS z konfiguracją środowiska w Web.config.
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
źródło
Zmodyfikowałem odpowiedź, którą otrzymał @Christian Del Bianco . Zmieniłem proces dla .net core 2 i upper jako plik project.json teraz absolutny.
Najpierw utwórz plik appsettings.json w katalogu głównym. z zawartością
Następnie utwórz dwa kolejne pliki ustawień appsettings.Development.json i appsettings.Production.json z wymaganą konfiguracją.
Dodaj niezbędny kod, aby skonfigurować środowisko do pliku Program.cs .
}
Dodaj envsettings.json do .csproj pliku dla kopii opublikowanym katalogu.
Teraz po prostu zmień ASPNETCORE_ENVIRONMENT, jak chcesz w pliku envsettings.json i opublikuj.
źródło
Dla tych, którzy szukają tego w Azure Devops pipeline, można to osiągnąć, dodając zadanie PowerShell na maszynach docelowych i uruchamiając następujący skrypt:
źródło