Instalowanie platformy .NET w rolach usługi Azure Cloud Services (wersja klasyczna)

Ważne

Usługi Cloud Services (wersja klasyczna) są teraz przestarzałe dla nowych klientów i zostaną wycofane 31 sierpnia 2024 r. dla wszystkich klientów. Nowe wdrożenia powinny używać nowego modelu wdrażania opartego na usłudze Azure Resource Manager w usługach Azure Cloud Services (wsparcie dodatkowe).

W tym artykule opisano sposób instalowania wersji programu .NET Framework, które nie są dostarczane z systemem operacyjnym gościa platformy Azure. Możesz użyć platformy .NET w systemie operacyjnym gościa, aby skonfigurować role sieci Web i procesu roboczego usługi w chmurze.

Można na przykład zainstalować program .NET Framework 4.6.2 w rodzinie systemów operacyjnych gościa 4, który nie jest wyposażony w żadną wersję programu .NET Framework 4.6. (Rodzina systemu operacyjnego gościa 5 jest udostępniana w programie .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 programu .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 sieci Web i procesu roboczego, dołącz instalatora internetowego platformy .NET w ramach projektu usługi w chmurze. Uruchom instalatora w ramach zadań uruchamiania roli.

Dodawanie instalatora platformy .NET do projektu

Aby pobrać instalatora internetowego dla programu .NET Framework, wybierz wersję, którą chcesz zainstalować:

Aby dodać instalatora dla roli sieci Web :

  1. W Eksplorator rozwiązań w obszarze Role w projekcie usługi w chmurze kliknij prawym przyciskiem myszy rolę internetową i wybierz polecenie Dodaj>nowy folder. Utwórz folder o nazwie bin.
  2. Kliknij prawym przyciskiem myszy folder bin i wybierz polecenie 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.

Gdy pliki są dodawane 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ć program .NET Framework 4.6.2 w roli usługi w chmurze, nawet jeśli aplikacja jest przeznaczona dla programu .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 program .NET Framework 4.6 jest zainstalowany na podstawie aktualizacji bazy wiedzy. Aby uniknąć tych problemów, zainstaluj program .NET Framework 4.6.2, a nie wersję 4.6. Aby uzyskać więcej informacji, zobacz artykuł z bazy wiedzy 3118750 i 4340191.

Zawartość roli z plikami instalatora

Definiowanie zadań uruchamiania dla ról

Zadania uruchamiania umożliwiają wykonywanie operacji przed rozpoczęciem roli. Zainstalowanie programu .NET Framework w ramach zadania uruchamiania gwarantuje, że platforma jest zainstalowana przed uruchomieniem jakiegokolwiek kodu aplikacji. Aby uzyskać więcej informacji na temat zadań uruchamiania, zobacz Uruchamianie zadań uruchamiania na platformie Azure.

  1. 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 w celu zainstalowania programu .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ług Azure Cloud Services.

  2. Utwórz plik o nazwie install.cmd i dodaj następujący skrypt instalacji do pliku.

    Skrypt sprawdza, czy określona wersja programu .NET Framework jest obecna na komputerze, wysyłając zapytanie do rejestru. Jeśli wersja programu .NET Framework nie jest zainstalowana, zostanie otwarty instalator internetowy programu .NET Framework. 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 Notatnik systemu Windows, 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 po uruchomieniu pierwszego wiersza skryptu. Aby uniknąć tego błędu, wykonaj 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
    
  3. Dodaj plik install.cmd do każdej roli, używając polecenia Dodaj>istniejący element w Eksplorator rozwiązań zgodnie z opisem we wcześniejszej sekcji tego artykułu.

    Po zakończeniu tego kroku wszystkie role powinny mieć plik instalatora platformy .NET i plik install.cmd.

    Zawartość roli ze wszystkimi plikami

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 przeniesienia plików dziennika wygenerowanych 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 pulpitu zdalnego 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 umożliwia skonfigurowanie diagnostyki w celu transferu plików w katalogu dziennika w zasobie NETFXInstall do konta magazynu Diagnostyka w kontenerze obiektów blob netfx-install .

Wdrażanie usługi w chmurze

Podczas wdrażania usługi w chmurze zadania uruchamiania instalują program .NET Framework (w razie potrzeby). Role usługi w chmurze są w stanie zajęty podczas instalowania platformy. Jeśli instalacja platformy wymaga ponownego uruchomienia, role usługi mogą również zostać uruchomione ponownie.

Następne kroki