.NET installeren op Azure Cloud Services -rollen (klassiek)

Belangrijk

Cloud Services (klassiek) is nu afgeschaft voor nieuwe klanten en wordt op 31 augustus 2024 voor alle klanten buiten gebruik gesteld. Nieuwe implementaties moeten gebruikmaken van het nieuwe implementatiemodel op basis van Azure Resource Manager Azure Cloud Services (uitgebreide ondersteuning).

In dit artikel wordt beschreven hoe u versies van .NET Framework installeert die niet bij het Azure-gastbesturingssystemen worden geleverd. U kunt .NET in het gastbesturingssystemen gebruiken om de web- en werkrollen van uw cloudservice te configureren.

U kunt bijvoorbeeld .NET Framework 4.6.2 installeren op de gastbesturingssysteemfamilie 4, die niet wordt geleverd met een release van .NET Framework 4.6. (Het gastbesturingssysteem familie 5 wordt geleverd met .NET Framework 4.6.) Zie het releasenieuws van azure-gastbesturingssystemen voor de meest recente informatie over de azure-gastbesturingssystemen.

Belangrijk

De Azure SDK 2.9 bevat een beperking voor het implementeren van .NET Framework 4.6 in de gastbesturingssysteemfamilie 4 of eerder. Een oplossing voor de beperking is beschikbaar in de azure-cloud-services-files GitHub-opslagplaats.

Als u .NET wilt installeren op uw web- en werkrollen, neemt u het .NET-webinstallatieprogramma op als onderdeel van uw cloudserviceproject. Start het installatieprogramma als onderdeel van de opstarttaken van de rol.

Het .NET-installatieprogramma toevoegen aan uw project

Als u het webinstallatieprogramma voor de .NET Framework wilt downloaden, kiest u de versie die u wilt installeren:

Het installatieprogramma voor een webrol toevoegen:

  1. Klik in Solution Explorer onder Rollen in uw cloudserviceproject met de rechtermuisknop op uw webrol en selecteerNieuwe maptoevoegen>. Maak een map met de naam bin.
  2. Klik met de rechtermuisknop op de map bin en selecteerBestaand itemtoevoegen>. Selecteer het .NET-installatieprogramma en voeg dit toe aan de map Bin.

Het installatieprogramma voor een werkrol toevoegen:

  • Klik met de rechtermuisknop op uw werkrol en selecteerBestaand itemtoevoegen>. Selecteer het .NET-installatieprogramma en voeg dit toe aan de rol.

Wanneer bestanden op deze manier worden toegevoegd aan de map met rolinhoud, worden ze automatisch toegevoegd aan uw cloudservicepakket. De bestanden worden vervolgens geïmplementeerd op een consistente locatie op de virtuele machine. Herhaal dit proces voor elke web- en werkrol in uw cloudservice, zodat alle rollen een kopie van het installatieprogramma hebben.

Notitie

U moet .NET Framework 4.6.2 installeren op uw cloudservicerol, zelfs als uw toepassing is gericht op .NET Framework 4.6. Het gastbesturingssystemen bevat de Knowledge Base-3098779 en update-3097997. Er kunnen problemen optreden wanneer u uw .NET-toepassingen uitvoert als .NET Framework 4.6 boven op de Knowledge Base-updates is geïnstalleerd. U kunt deze problemen voorkomen door .NET Framework 4.6.2 te installeren in plaats van versie 4.6. Zie het Knowledge Base-artikel 3118750 en 4340191 voor meer informatie.

Inhoud van rollen met installatiebestanden

Opstarttaken voor uw rollen definiëren

U kunt opstarttaken gebruiken om bewerkingen uit te voeren voordat een rol wordt gestart. Als u de .NET Framework installeert als onderdeel van de opstarttaak, zorgt u ervoor dat het framework wordt geïnstalleerd voordat een toepassingscode wordt uitgevoerd. Zie Opstarttaken uitvoeren in Azure voor meer informatie over opstarttaken.

  1. Voeg de volgende inhoud toe aan het bestand ServiceDefinition.csdef onder het knooppunt WebRole of WorkerRole voor alle rollen:

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

    Met de voorgaande configuratie wordt de consoleopdracht install.cmd uitgevoerd met beheerdersbevoegdheden om de .NET Framework te installeren. De configuratie maakt ook een LocalStorage-element met de naam NETFXInstall. Het opstartscript stelt de tijdelijke map in voor het gebruik van deze lokale opslagresource.

    Belangrijk

    Voor een juiste installatie van het framework stelt u de grootte van deze resource in op ten minste 1024 MB.

    Zie Algemene opstarttaken van Azure Cloud Services voor meer informatie over opstarttaken.

  2. Maak een bestand met de naam install.cmd en voeg het volgende installatiescript toe aan het bestand.

    Het script controleert of de opgegeven versie van de .NET Framework al op de computer is geïnstalleerd door een query uit te voeren op het register. Als de .NET Framework versie niet is geïnstalleerd, wordt het .NET Framework webinstallatieprogramma geopend. Om eventuele problemen op te lossen, registreert het script alle activiteiten in het bestand startuptasklog-(huidige datum en tijd).txt dat is opgeslagen in de lokale opslag installLogs .

    Belangrijk

    Gebruik een eenvoudige teksteditor zoals Windows Kladblok om het bestand install.cmd te maken. Als u Visual Studio gebruikt om een tekstbestand te maken en de extensie wijzigt in .cmd, bevat het bestand mogelijk nog steeds een UTF-8-bytevolgordemarkering. Deze markering kan een fout veroorzaken wanneer de eerste regel van het script wordt uitgevoerd. Om deze fout te voorkomen, maakt u van de eerste regel van het script een REM-instructie die kan worden overgeslagen door de byteorderverwerking.

    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. Voeg het bestand install.cmd toe aan elke rol met behulp vanBestaand itemtoevoegen> in Solution Explorer zoals eerder in dit onderwerp is beschreven.

    Nadat deze stap is voltooid, moeten alle rollen het .NET-installatiebestand en het bestand install.cmd hebben.

    Rolinhoud met alle bestanden

Diagnostische gegevens configureren om opstartlogboeken over te dragen naar Blob Storage

Om het oplossen van installatieproblemen te vereenvoudigen, kunt u Azure Diagnostics configureren om logboekbestanden die zijn gegenereerd door het opstartscript of het .NET-installatieprogramma over te dragen naar Azure Blob Storage. Met deze methode kunt u de logboeken bekijken door de logboekbestanden te downloaden uit Blob Storage in plaats van extern bureaublad in de rol te moeten gebruiken.

Als u Diagnostische gegevens wilt configureren, opent u het bestand diagnostics.wadcfgx en voegt u de volgende inhoud toe onder het knooppunt Directory's :

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

Met deze XML configureert u Diagnostische gegevens om de bestanden in de logboekmap in de RESOURCE NETFXInstall over te dragen naar het opslagaccount Diagnostische gegevens in de blobcontainer netfx-install .

Uw cloudservice implementeren

Wanneer u uw cloudservice implementeert, installeren de opstarttaken de .NET Framework als deze nog niet is geïnstalleerd. Uw cloudservicerollen hebben de status Bezet terwijl het framework wordt geïnstalleerd. Als de frameworkinstallatie opnieuw moet worden opgestart, kunnen de servicerollen ook opnieuw worden opgestart.

Aanvullende resources