.NET installeren in Azure Cloud Services-rollen (klassiek)
Belangrijk
Cloud Services (klassiek) is vanaf 1 september 2024 afgeschaft voor alle klanten. Bestaande actieve implementaties worden gestopt en afgesloten door Microsoft en de gegevens gaan vanaf oktober 2024 definitief verloren. Nieuwe implementaties moeten gebruikmaken van het nieuwe op Azure Resource Manager gebaseerde implementatiemodel Azure Cloud Services (uitgebreide ondersteuning).
In dit artikel wordt beschreven hoe u versies van .NET Framework installeert die niet worden geleverd met het Azure-gastbesturingssystemen. U kunt .NET in het gastbesturingssysteem gebruiken om de web- en werkrollen van uw cloudservice te configureren.
U kunt bijvoorbeeld .NET Framework 4.6.2 installeren op de gastbesturingssystemenfamilie 4, die niet wordt geleverd met een release van .NET Framework 4.6. (De gastbesturingssystemenfamilie 5 wordt geleverd met .NET Framework 4.6.) Zie het releasenieuws van azure-gastbesturingssystemen voor de meest recente informatie over de releases van het Azure-gastbesturingssystemen.
Belangrijk
De Azure SDK 2.9 bevat een beperking voor het implementeren van .NET Framework 4.6 op de gastbesturingssystemenfamilie 4 of eerder. Er is een oplossing voor de beperking beschikbaar in de azure-cloud-services-files
GitHub-opslagplaats.
Als u .NET op uw web- en werkrollen wilt installeren, 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 .NET Framework wilt downloaden, kiest u de versie die u wilt installeren:
- .NET Framework 4.8.1-webinstallatieprogramma
- .NET Framework 4.8-webinstallatieprogramma
- .NET Framework 4.7.2-webinstallatieprogramma
- .NET Framework 4.6.2-webinstallatieprogramma
Het installatieprogramma voor een webrol toevoegen:
- Klik in Solution Explorer onder Rollen in uw cloudserviceproject met de rechtermuisknop op uw webrol en selecteer Nieuwe map toevoegen>. Maak een map met de naam bin.
- Klik met de rechtermuisknop op de map Bin en selecteer Bestaand item toevoegen>. Selecteer het .NET-installatieprogramma en voeg het toe aan de bin-map.
Het installatieprogramma voor een werkrol toevoegen:
- Klik met de rechtermuisknop op uw werkrol en selecteer Bestaand item toevoegen>. Selecteer het .NET-installatieprogramma en voeg het toe aan de rol.
Wanneer bestanden op deze manier worden toegevoegd aan de map met rolinhoud, voegen ze automatisch toe 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
Installeer .NET Framework 4.6.2 op uw cloudservicerol, zelfs als uw toepassing is gericht op .NET Framework 4.6. Het gastbesturingssystemen bevatten de Knowledge Base-update 3098779 en 3097997 bijwerken. Er kunnen problemen optreden wanneer u uw .NET-toepassingen uitvoert als .NET Framework 4.6 is geïnstalleerd boven op de Knowledge Base-updates. Installeer .NET Framework 4.6.2 in plaats van versie 4.6 om deze problemen te voorkomen. Zie het Knowledge Base-artikel 3118750 en 4340191 voor meer informatie.
Opstarttaken voor uw rollen definiëren
U kunt opstarttaken gebruiken om bewerkingen uit te voeren voordat een rol wordt gestart. Als u .NET Framework installeert als onderdeel van de opstarttaak, zorgt u ervoor dat het framework wordt geïnstalleerd voordat toepassingscode wordt uitgevoerd. Zie Opstarttaken uitvoeren in Azure voor meer informatie over opstarttaken.
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>
De voorgaande configuratie voert de consoleopdracht
install.cmd
uit met beheerdersbevoegdheden om .NET Framework te installeren. De configuratie maakt ook een LocalStorage-element met de naam NETFXInstall. Met het opstartscript wordt de tijdelijke map ingesteld voor het gebruik van deze lokale opslagresource.Belangrijk
Als u de juiste installatie van het framework wilt garanderen, 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.
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 .NET Framework aanwezig is op uw computer door een query uit te voeren op het register. Als de .NET Framework-versie niet is geïnstalleerd, wordt het webinstallatieprogramma van .NET Framework geopend. Om eventuele problemen op te lossen, registreert het script alle activiteiten naar het bestand startuptasklog-(huidige datum en tijd).txt die is opgeslagen in de lokale opslag van InstallLogs .
Belangrijk
Gebruik een eenvoudige teksteditor zoals Windows Kladblok om het install.cmd-bestand te maken. Als u Visual Studio gebruikt om een tekstbestand te maken en de extensie te wijzigen 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. Als u deze fout wilt voorkomen, maakt u 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
Voeg het install.cmd-bestand toe aan elke rol met behulp van Bestaand item toevoegen>in Solution Explorer, zoals eerder in dit artikel is beschreven.
Nadat deze stap is voltooid, moeten alle rollen het .NET-installatiebestand en het install.cmd-bestand hebben.
Diagnostische gegevens configureren voor het overdragen van opstartlogboeken naar Blob Storage
Ter vereenvoudiging van het oplossen van installatieproblemen kunt u Azure Diagnostics configureren voor het overdragen van logboekbestanden die zijn gegenereerd door het opstartscript of het .NET-installatieprogramma 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 hoeven 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 voor het overdragen van de bestanden in de logboekmap in de NETFXInstall-resource naar het diagnostische opslagaccount in de blobcontainer netfx-install .
Uw cloudservice implementeren
Wanneer u uw cloudservice implementeert, installeren de opstarttaken het .NET Framework (indien nodig). 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.