Sdílet prostřednictvím


Instalace .NET v rolích Azure Cloud Services (Classic)

Důležité

Služba Cloud Services (Classic) je teď pro nové zákazníky zastaralá a bude vyřazena 31. srpna 2024 pro všechny zákazníky. Nová nasazení by měla používat nový model nasazení založený na Azure Resource Manageru na Azure Cloud Services (rozšířená podpora).

Tento článek popisuje, jak nainstalovat verze rozhraní .NET Framework, které nejsou součástí hostovaného operačního systému Azure. Pomocí .NET v hostovaném operačním systému můžete nakonfigurovat webovou službu a role pracovního procesu cloudové služby.

Můžete například nainstalovat rozhraní .NET Framework 4.6.2 do řady hostovaných operačních systému 4, které neobsahuje žádnou verzi rozhraní .NET Framework 4.6. (Řada hostovaného operačního systému 5 obsahuje rozhraní .NET Framework 4.6.) Nejnovější informace o vydaných verzích hostovaného operačního systému Azure najdete ve zprávách o vydání hostovaného operačního systému Azure.

Důležité

Sada Azure SDK 2.9 obsahuje omezení nasazení rozhraní .NET Framework 4.6 v sadě hostovaného operačního systému 4 nebo starší. Oprava omezení je dostupná v úložišti azure-cloud-services-filesGitHubu.

Pokud chcete nainstalovat .NET na webovou roli a role pracovního procesu, zahrňte do projektu cloudové služby webový instalační program .NET. Spusťte instalační program jako součást úloh při spuštění role.

Přidání instalačního programu .NET do projektu

Pokud chcete stáhnout webový instalační program pro rozhraní .NET Framework, zvolte verzi, kterou chcete nainstalovat:

Přidání instalačního programu pro webovou roli:

  1. V Průzkumník řešení klikněte v části Role v projektu cloudové služby pravým tlačítkem na webovou roli a vyberte Přidat>novou složku. Vytvořte složku s názvem bin.
  2. Klikněte pravým tlačítkem na složku přihrádky a vyberte Přidat>existující položku. Vyberte instalační program .NET a přidejte ho do složky bin.

Přidání instalačního programu pro roli pracovního procesu :

  • Klikněte pravým tlačítkem na roli pracovního procesu a vyberte Přidat>existující položku. Vyberte instalační program .NET a přidejte ho do role.

Když se soubory tímto způsobem přidají do složky obsahu role, automaticky se přidají do balíčku cloudové služby. Soubory se pak nasadí do konzistentního umístění na virtuálním počítači. Tento postup opakujte pro každou webovou a pracovní roli ve vaší cloudové službě, aby všechny role měly kopii instalačního programu.

Poznámka:

Na roli cloudové služby byste měli nainstalovat rozhraní .NET Framework 4.6.2, i když vaše aplikace cílí na rozhraní .NET Framework 4.6. Hostovaný operační systém zahrnuje aktualizaci znalostní báze 3098779 a aktualizaci 3097997. K problémům může dojít při spuštění aplikací .NET, pokud je rozhraní .NET Framework 4.6 nainstalované nad aktualizacemi znalostní báze. Abyste se těmto problémům vyhnuli, nainstalujte .NET Framework 4.6.2 místo verze 4.6. Další informace najdete v článku znalostní báze Knowledge Base 3118750 a 4340191.

Obsah role se soubory instalačního programu

Definování úloh po spuštění pro vaše role

Úlohy po spuštění můžete použít k provádění operací před spuštěním role. Instalace rozhraní .NET Framework jako součást spouštěcí úlohy zajistí, že se architektura nainstaluje před spuštěním jakéhokoli kódu aplikace. Další informace o úlohách po spuštění najdete v tématu Spouštění úloh po spuštění v Azure.

  1. Do souboru ServiceDefinition.csdef v uzlu WebRole nebo WorkerRole pro všechny role přidejte následující obsah:

    <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>
    

    Předchozí konfigurace spustí příkaz install.cmd konzoly s oprávněními správce k instalaci rozhraní .NET Framework. Konfigurace také vytvoří element LocalStorage s názvem NETFXInstall. Spouštěcí skript nastaví složku temp tak, aby používala tento místní prostředek úložiště.

    Důležité

    Chcete-li zajistit správnou instalaci rozhraní, nastavte velikost tohoto prostředku alespoň na 1 024 MB.

    Další informace o úlohách po spuštění najdete v tématu Běžné úlohy spuštění služby Azure Cloud Services.

  2. Vytvořte soubor s názvem install.cmd a do souboru přidejte následující instalační skript.

    Skript zkontroluje, jestli je na vašem počítači k dispozici zadaná verze rozhraní .NET Framework, a to dotazováním registru. Pokud není nainstalovaná verze rozhraní .NET Framework, otevře se webový instalační program rozhraní .NET Framework. Skript při řešení potíží zaznamená veškerou aktivitu do souboru startuptasklog-(aktuální datum a čas).txt, který je uložený v místním úložišti InstallLogs .

    Důležité

    K vytvoření souboru install.cmd použijte základní textový editor, jako je Windows Notepad. Pokud pomocí sady Visual Studio vytvoříte textový soubor a změníte příponu na .cmd, může soubor stále obsahovat značku pořadí bajtů UTF-8. Tato značka může způsobit chybu při spuštění prvního řádku skriptu. Chcete-li se této chybě vyhnout, proveďte první řádek skriptu příkaz REM, který lze přeskočit zpracováním pořadí bajtů.

    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. Přidejte do každé role soubor install.cmd pomocí funkce Přidat>existující položku v Průzkumník řešení, jak je popsáno výše v tomto článku.

    Po dokončení tohoto kroku by všechny role měly mít instalační soubor .NET a soubor install.cmd.

    Obsah role se všemi soubory

Konfigurace diagnostiky pro přenos protokolů po spuštění do úložiště objektů blob

Pokud chcete zjednodušit řešení potíží s instalací, můžete nakonfigurovat Azure Diagnostics tak, aby přenášela všechny soubory protokolu vygenerované spouštěcím skriptem nebo instalačním programem .NET do služby Azure Blob Storage. Pomocí tohoto přístupu můžete protokoly zobrazit stažením souborů protokolu ze služby Blob Storage a nemusíte se do role vzdáleně připojit ke vzdálené ploše.

Pokud chcete nakonfigurovat diagnostiku, otevřete soubor diagnostics.wadcfgx a do uzlu Adresáře přidejte následující obsah:

<DataSources>
 <DirectoryConfiguration containerName="netfx-install">
  <LocalResource name="NETFXInstall" relativePath="log"/>
 </DirectoryConfiguration>
</DataSources>

Tento kód XML nakonfiguruje diagnostiku pro přenos souborů v adresáři protokolu v prostředku NETFXInstall do účtu úložiště diagnostiky v kontejneru objektů blob netfx-install .

Nasazení cloudové služby

Když nasadíte cloudovou službu, úlohy po spuštění nainstalují rozhraní .NET Framework (v případě potřeby). Vaše role cloudové služby jsou v zaneprázdněném stavu, zatímco se architektura instaluje. Pokud instalace architektury vyžaduje restartování, můžou se také restartovat role služby.

Další kroky