Instalowanie platformy .NET w rolach usługi Azure Cloud Services (wersja klasyczna)
Ważne
Cloud Services (wersja klasyczna) jest teraz przestarzała dla nowych klientów i zostanie wycofana 31 sierpnia 2024 r. dla wszystkich klientów. Nowe wdrożenia powinny korzystać z nowego modelu wdrażania opartego na usłudze Azure Resource Manager Azure Cloud Services (rozszerzona obsługa)."
W tym artykule opisano sposób instalowania wersji .NET Framework, które nie są dostarczane z systemem operacyjnym gościa platformy Azure. W systemie operacyjnym gościa można użyć platformy .NET, aby skonfigurować role sieci Web i procesu roboczego usługi w chmurze.
Na przykład można zainstalować .NET Framework 4.6.2 w rodzinie systemu operacyjnego gościa 4, która nie zawiera żadnej wersji .NET Framework 4.6. (Rodzina systemu operacyjnego gościa 5 jest wyposażona w .NET Framework 4.6). Aby uzyskać najnowsze informacje na temat wersji systemu operacyjnego gościa platformy Azure, zobacz informacje o wersji systemu operacyjnego gościa platformy Azure.
Ważne
Zestaw Azure SDK 2.9 zawiera ograniczenie wdrażania .NET Framework 4.6 w rodzinie systemu operacyjnego gościa 4 lub starszej. Poprawka ograniczenia jest dostępna w azure-cloud-services-files
repozytorium GitHub.
Aby zainstalować platformę .NET w rolach internetowych i procesów roboczych, dołącz instalatora internetowego platformy .NET w ramach projektu usługi w chmurze. Uruchom instalatora jako część zadań uruchamiania roli.
Dodawanie instalatora platformy .NET do projektu
Aby pobrać instalatora internetowego dla .NET Framework, wybierz wersję, którą chcesz zainstalować:
- instalator internetowy .NET Framework 4.8.1
- instalator sieci Web .NET Framework 4.8
- instalator internetowy .NET Framework 4.7.2
- instalator internetowy .NET Framework 4.6.2
Aby dodać instalatora dla roli sieci Web :
- W Eksplorator rozwiązań w obszarze Role w projekcie usługi w chmurze kliknij prawym przyciskiem myszy rolę internetową i wybierz pozycję Dodaj>nowy folder. Utwórz folder o nazwie bin.
- Kliknij prawym przyciskiem myszy folder bin i wybierz pozycję Dodaj>istniejący element. Wybierz instalatora platformy .NET i dodaj go do folderu bin.
Aby dodać instalatora dla roli procesu roboczego :
- Kliknij prawym przyciskiem myszy rolę procesu roboczego i wybierz pozycję Dodaj>istniejący element. Wybierz instalatora platformy .NET i dodaj go do roli.
Po dodaniu plików w ten sposób do folderu zawartości roli są one automatycznie dodawane do pakietu usługi w chmurze. Pliki są następnie wdrażane w spójnej lokalizacji na maszynie wirtualnej. Powtórz ten proces dla każdej roli sieci Web i procesu roboczego w usłudze w chmurze, aby wszystkie role miały kopię instalatora.
Uwaga
Należy zainstalować .NET Framework 4.6.2 w roli usługi w chmurze, nawet jeśli aplikacja jest przeznaczona .NET Framework 4.6. System operacyjny gościa zawiera 3098779 aktualizacji bazy wiedzy i aktualizacji 3097997. Problemy mogą wystąpić podczas uruchamiania aplikacji .NET, jeśli .NET Framework 4.6 jest instalowana na podstawie aktualizacji bazy wiedzy. Aby uniknąć tych problemów, zainstaluj .NET Framework 4.6.2 zamiast wersji 4.6. Aby uzyskać więcej informacji, zobacz artykuł z bazy wiedzy 3118750 i 4340191.
Definiowanie zadań uruchamiania dla ról
Zadania uruchamiania umożliwiają wykonywanie operacji przed rozpoczęciem roli. Zainstalowanie .NET Framework w ramach zadania uruchamiania gwarantuje, że platforma zostanie zainstalowana przed uruchomieniem kodu aplikacji. Aby uzyskać więcej informacji na temat zadań uruchamiania, zobacz Uruchamianie zadań uruchamiania na platformie Azure.
Dodaj następującą zawartość do pliku ServiceDefinition.csdef w węźle WebRole lub WorkerRole dla wszystkich ról:
<LocalResources> <LocalStorage name="NETFXInstall" sizeInMB="1024" cleanOnRoleRecycle="false" /> </LocalResources> <Startup> <Task commandLine="install.cmd" executionContext="elevated" taskType="simple"> <Environment> <Variable name="PathToNETFXInstall"> <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='NETFXInstall']/@path" /> </Variable> <Variable name="ComputeEmulatorRunning"> <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> </Variable> </Environment> </Task> </Startup>
Poprzednia konfiguracja uruchamia polecenie
install.cmd
konsoli z uprawnieniami administratora, aby zainstalować .NET Framework. Konfiguracja tworzy również element LocalStorage o nazwie NETFXInstall. Skrypt uruchamiania ustawia folder tymczasowy na użycie tego zasobu magazynu lokalnego.Ważne
Aby zapewnić poprawną instalację platformy, ustaw rozmiar tego zasobu na co najmniej 1024 MB.
Aby uzyskać więcej informacji na temat zadań uruchamiania, zobacz Typowe zadania uruchamiania usługi Azure Cloud Services.
Utwórz plik o nazwie install.cmd i dodaj następujący skrypt instalacji do pliku.
Skrypt sprawdza, czy określona wersja .NET Framework jest już zainstalowana na maszynie, wysyłając zapytanie do rejestru. Jeśli wersja .NET Framework nie jest zainstalowana, zostanie otwarty instalator .NET Framework sieci Web. Aby rozwiązać wszelkie problemy, skrypt rejestruje wszystkie działania w pliku startuptasklog-(bieżąca data i godzina).txt przechowywane w magazynie lokalnym InstallLogs .
Ważne
Użyj podstawowego edytora tekstów, takiego jak Windows Notatnik, aby utworzyć plik install.cmd. Jeśli używasz programu Visual Studio do tworzenia pliku tekstowego i zmieniasz rozszerzenie na .cmd, plik może nadal zawierać znacznik kolejności bajtów UTF-8. Ten znacznik może spowodować błąd podczas uruchamiania pierwszego wiersza skryptu. Aby uniknąć tego błędu, utwórz pierwszy wiersz skryptu instrukcji REM, która może zostać pominięta przez przetwarzanie kolejności bajtów.
REM Set the value of netfx to install appropriate .NET Framework. REM ***** To install .NET 4.5.2 set the variable netfx to "NDP452" ***** https://go.microsoft.com/fwlink/?LinkId=397707 REM ***** To install .NET 4.6 set the variable netfx to "NDP46" ***** https://go.microsoft.com/fwlink/?LinkId=528222 REM ***** To install .NET 4.6.1 set the variable netfx to "NDP461" ***** https://go.microsoft.com/fwlink/?LinkId=671729 REM ***** To install .NET 4.6.2 set the variable netfx to "NDP462" ***** https://go.microsoft.com/fwlink/?linkid=780596 REM ***** To install .NET 4.7 set the variable netfx to "NDP47" ***** https://go.microsoft.com/fwlink/?LinkId=825298 REM ***** To install .NET 4.7.1 set the variable netfx to "NDP471" ***** https://go.microsoft.com/fwlink/?LinkId=852095 REM ***** To install .NET 4.7.2 set the variable netfx to "NDP472" ***** https://go.microsoft.com/fwlink/?LinkId=863262 REM ***** To install .NET 4.8 set the variable netfx to "NDP48" ***** https://dotnet.microsoft.com/download/thank-you/net48 REM ***** To install .NET 4.8.1 set the variable netfx to "NDP481" ***** https://go.microsoft.com/fwlink/?linkid=2215256 set netfx="NDP481" REM ***** Set script start timestamp **** set timehour=%time:~0,2% set timestamp=%date:~-4,4%%date:~-10,2%%date:~-7,2%-%timehour: =0%%time:~3,2% set "log=install.cmd started %timestamp%." REM ***** Exit script if running in Emulator ***** if "%ComputeEmulatorRunning%"=="true" goto exit REM ***** Needed to correctly install .NET 4.6.1, otherwise you may see an out of disk space error ***** set TMP=%PathToNETFXInstall% set TEMP=%PathToNETFXInstall% REM ***** Setup .NET filenames and registry keys ***** if %netfx%=="NDP481" goto NDP481 if %netfx%=="NDP48" goto NDP48 if %netfx%=="NDP472" goto NDP472 if %netfx%=="NDP471" goto NDP471 if %netfx%=="NDP47" goto NDP47 if %netfx%=="NDP462" goto NDP462 if %netfx%=="NDP461" goto NDP461 if %netfx%=="NDP46" goto NDP46 set "netfxinstallfile=NDP452-KB2901954-Web.exe" set netfxregkey="0x5cbf5" set netfxUrl="https://go.microsoft.com/fwlink/?LinkId=397707" goto logtimestamp :NDP46 set "netfxinstallfile=NDP46-KB3045560-Web.exe" set netfxregkey="0x6004f" set netfxUrl="https://go.microsoft.com/fwlink/?LinkId=528222" goto logtimestamp :NDP461 set "netfxinstallfile=NDP461-KB3102438-Web.exe" set netfxregkey="0x6040e" set netfxUrl="https://go.microsoft.com/fwlink/?LinkId=671729" goto logtimestamp :NDP462 set "netfxinstallfile=NDP462-KB3151802-Web.exe" set netfxregkey="0x60632" set netfxUrl="https://go.microsoft.com/fwlink/?linkid=780596" goto logtimestamp :NDP47 set "netfxinstallfile=NDP47-KB3186500-Web.exe" set netfxregkey="0x707FE" set netfxUrl="https://go.microsoft.com/fwlink/?LinkId=825298" goto logtimestamp :NDP471 set "netfxinstallfile=NDP471-KB4033344-Web.exe" set netfxregkey="0x709fc" set netfxUrl="https://go.microsoft.com/fwlink/?LinkId=852095" goto logtimestamp :NDP472 set "netfxinstallfile=NDP472-KB4054531-Web.exe" set netfxregkey="0x70BF0" set netfxUrl="https://go.microsoft.com/fwlink/?LinkId=863262" goto logtimestamp :NDP48 set "netfxinstallfile=NDP48-Web.exe" set netfxregkey="0x80EA8" set netfxUrl="https://dotnet.microsoft.com/download/thank-you/net48" goto logtimestamp :NDP481 set "netfxinstallfile=NDP481-Web.exe" set netfxregkey="0x82348" set netfxUrl="https://go.microsoft.com/fwlink/?linkid=2215256" goto logtimestamp :logtimestamp REM ***** Setup LogFile with timestamp ***** md "%PathToNETFXInstall%\log" set startuptasklog="%PathToNETFXInstall%log\startuptasklog-%timestamp%.txt" set netfxinstallerlog="%PathToNETFXInstall%log\NetFXInstallerLog-%timestamp%" echo %log% >> %startuptasklog% echo Logfile generated at: %startuptasklog% >> %startuptasklog% echo TMP set to: %TMP% >> %startuptasklog% echo TEMP set to: %TEMP% >> %startuptasklog% REM ***** Check if .NET is installed ***** echo Checking if .NET (%netfx%) is installed >> %startuptasklog% set /A netfxregkeydecimal=%netfxregkey% set foundkey=0 FOR /F "usebackq skip=2 tokens=1,2*" %%A in (`reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release 2^>nul`) do @set /A foundkey=%%C echo Minimum required key: %netfxregkeydecimal% -- found key: %foundkey% >> %startuptasklog% if %foundkey% GEQ %netfxregkeydecimal% goto installed REM ***** Downloading .NET Framework Setup ***** set retryCount=0 set maxRetry=3 set delayInSeconds=60 echo Downloading .NET Framework %netfx% setup with commandline: powershell -Command "Invoke-WebRequest %netfxUrl% -OutFile %~dp0%netfxinstallfile%" >> %startuptasklog% goto loop :loop if %retryCount% NEQ 0 echo %date% %time% : Waiting %delayInSeconds% seconds to retry >> %startuptasklog% if %retryCount% NEQ 0 (powershell -Command "Start-Sleep -Seconds %delayInSeconds%") set /a retryCount=%retryCount%+1 echo %date% %time% : Try downloading... [%retryCount% of %maxRetry%] >> %startuptasklog% powershell -Command "Invoke-WebRequest %netfxUrl% -OutFile %~dp0%netfxinstallfile%" if %ERRORLEVEL% NEQ 0 if %retryCount% NEQ %maxRetry% goto loop if %ERRORLEVEL% NEQ 0 if %retryCount%== %maxRetry% echo Taking existing file to install since error occurred while downloading .NET framework %netfx% setup from %netfxUrl%. >> %startuptasklog% if %ERRORLEVEL%== 0 echo %date% %time% : Successfully downloaded .NET framework %netfx% setup file. >> %startuptasklog% goto install :install REM ***** Installing .NET ***** echo Installing .NET with commandline: start /wait %~dp0%netfxinstallfile% /q /serialdownload /log %netfxinstallerlog% /chainingpackage "CloudService Startup Task" >> %startuptasklog% start /wait %~dp0%netfxinstallfile% /q /serialdownload /log %netfxinstallerlog% /chainingpackage "CloudService Startup Task" >> %startuptasklog% 2>>&1 if %ERRORLEVEL%== 0 goto installed echo .NET installer exited with code %ERRORLEVEL% >> %startuptasklog% if %ERRORLEVEL%== 3010 goto restart if %ERRORLEVEL%== 1641 goto restart echo .NET (%netfx%) install failed with Error Code %ERRORLEVEL%. Further logs can be found in %netfxinstallerlog% >> %startuptasklog% goto exit :restart echo Restarting to complete .NET (%netfx%) installation >> %startuptasklog% shutdown.exe /r /t 5 /c "Installed .NET framework" /f /d p:2:4 :installed echo .NET (%netfx%) is installed >> %startuptasklog% :end echo install.cmd completed: %date:~-4,4%%date:~-10,2%%date:~-7,2%-%timehour: =0%%time:~3,2% >> %startuptasklog% :exit EXIT /B 0
Dodaj plik install.cmd do każdej roli przy użyciu polecenia Dodaj>istniejący element w Eksplorator rozwiązań, jak opisano wcześniej w tym temacie.
Po ukończeniu tego kroku wszystkie role powinny mieć plik instalatora .NET i plik install.cmd.
Konfigurowanie diagnostyki w celu transferu dzienników uruchamiania do usługi Blob Storage
Aby uprościć rozwiązywanie problemów z instalacją, można skonfigurować Diagnostyka Azure w celu transferu wszystkich plików dziennika generowanych przez skrypt uruchamiania lub instalatora platformy .NET do usługi Azure Blob Storage. Korzystając z tego podejścia, można wyświetlić dzienniki, pobierając pliki dziennika z usługi Blob Storage zamiast konieczności zdalnego pulpitu do roli.
Aby skonfigurować diagnostykę, otwórz plik diagnostics.wadcfgx i dodaj następującą zawartość w węźle Katalogi :
<DataSources>
<DirectoryConfiguration containerName="netfx-install">
<LocalResource name="NETFXInstall" relativePath="log"/>
</DirectoryConfiguration>
</DataSources>
Ten kod XML konfiguruje diagnostykę do transferu plików w katalogu dziennika w zasobie NETFXInstall do konta magazynu diagnostyki w kontenerze obiektów blob netfx-install .
Wdrażanie usługi w chmurze
Podczas wdrażania usługi w chmurze zadania uruchamiania instalują .NET Framework, jeśli nie zostały jeszcze zainstalowane. Role usługi w chmurze są w stanie zajętości podczas instalowania platformy. Jeśli instalacja platformy wymaga ponownego uruchomienia, role usługi mogą również zostać uruchomione ponownie.