Installieren von .NET in Rollen in Azure Cloud Services (klassisch)

Wichtig

Cloud Services (klassisch) wurde für neue Kunden nun als veraltet gekennzeichnet und wird am 31. August 2024 für alle Kunden ausgemustert. In neuen Bereitstellungen sollte das neue auf Azure Resource Manager basierende Bereitstellungsmodell für Azure Cloud Services (erweiterter Support) verwendet werden.

Dieser Artikel beschreibt die Installation von .NET Framework-Versionen, die nicht im Funktionsumfang des Azure-Gastbetriebssystems vorhanden sind. Sie können .NET im Gastbetriebssystem zum Konfigurieren Ihrer Clouddienstweb- und -workerrollen nutzen.

Sie können .NET Framework 4.6.2 für die Gastbetriebssystemfamilie 4 installieren, die keine Version von .NET Framework 4.6 enthält. (Die Gastbetriebssystemfamilie 5 ist in .NET Framework 4.6 enthalten.) Aktuelle Informationen zu Versionen von Azure-Gastbetriebssystemversionen finden Sie unter Neuigkeiten zur Version des Azure-Gastbetriebssystems.

Wichtig

Das Azure SDK 2.9 weist eine Einschränkung für die Bereitstellung von .NET Framework 4.6 in Gastbetriebssystemfamilien bis Version 4 auf. Ein Fix für die Einschränkung ist im azure-cloud-services-files-GitHub-Repository verfügbar.

Zum Installieren von .NET für Ihre Web- und Workerrollen fügen Sie Ihrem Clouddienstprojekt den .NET-Webinstaller hinzu. Starten Sie den Installer im Rahmen der Startaufgaben der Rolle.

Das Installationsprogramm für .NET zu Ihrem Projekt hinzufügen

Laden Sie den Webinstaller der .NET Framework-Version herunter, die Sie installieren möchten:

So fügen Sie den Installer für eine Webrolle hinzu

  1. Klicken Sie im Projektmappen-Explorer im Clouddienstprojekt unter Rollen mit der rechten Maustaste auf Ihre Webrolle, und wählen Sie Hinzufügen>Neuer Ordner aus. Erstellen Sie einen Ordner mit dem Namen bin.
  2. Klicken Sie mit der rechten Maustaste auf den Ordner „bin“, und wählen Sie Hinzufügen>Vorhandenes Element aus. Wählen Sie das Installationsprogramm für .NET aus und fügen Sie es dem Ordner "Bin" hinzu.

So fügen Sie den Installer für eine Workerrolle hinzu

  • Klicken Sie mit der rechten Maustaste auf Ihre Workerrolle, und wählen Sie Hinzufügen>Vorhandenes Element aus. Wählen Sie das Installationsprogramm für .NET aus und fügen Sie zur Rolle hinzu.

Wenn Dateien auf diese Weise dem Inhaltsordner für die Rolle hinzugefügt werden, werden sie automatisch Ihrem Clouddienstpaket hinzugefügt. Die Dateien werden dann in einem einheitlichen Speicherort auf dem virtuellen Computer bereitgestellt. Wiederholen Sie diesen Vorgang für alle Web- und Workerrollen in Ihrem Clouddienst, sodass alle Rollen über eine Kopie des Installers verfügen.

Hinweis

Sie sollten .NET Framework 4.6.2 für Ihre Clouddienstrolle installieren, auch wenn Ihre Anwendung auf .NET Framework 4.6 ausgerichtet ist. Das Gastbetriebssystem enthält Update 3098779 und Update 3097997 aus der Knowledge Base. Probleme beim Ausführen Ihrer .NET-Anwendungen können auftreten, wenn .NET Framework 4.6 über die Knowledge Base-Updates installiert wird. Installieren Sie .NET Framework 4.6.2 statt Version 4.6, um diese Probleme zu vermeiden. Weitere Informationen finden Sie in den Knowledge Base-Artikeln 3118750 und 4340191.

Inhalte der Rolle mit Installerdateien

Definieren von Startaufgaben für Ihre Rollen

Mit Startaufgaben können Sie Vorgänge ausführen, bevor eine Rolle gestartet wird. Die Installation von .NET Framework als Teil der Startaufgabe stellt sicher, dass das Framework installiert ist, bevor Anwendungscode ausgeführt wird. Weitere Informationen zu Startaufgaben finden Sie unter Ausführen von Startaufgaben in Azure.

  1. Fügen Sie der Datei „ServiceDefinition.csdef“ unter dem Knoten WebRole oder WorkerRole für alle Rollen folgenden Inhalt hinzu:

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

    Die oben genannte Konfiguration führt den Konsolenbefehl install.cmd mit Administratorrechten aus, um .NET Framework zu installieren. Über die Konfiguration wird auch ein LocalStorage-Element mit dem Namen NETFXInstall erstellt. Das Startskript aktiviert den temporären Ordner zur Verwendung der lokalen Speicherressource.

    Wichtig

    Um die ordnungsgemäße Installation des Frameworks sicherzustellen, legen Sie die Größe dieser Ressource auf mindestens 1.024 MB fest.

    Weitere Informationen zu Startaufgaben finden Sie unter Allgemeine Startaufgaben für Azure Cloud Services.

  2. Erstellen Sie eine Datei mit dem Namen install.cmd, und fügen Sie ihr das folgende Installationsskript hinzu.

    Das Skript überprüft, ob die angegebene .NET-Framework-Version bereits auf dem Computer installiert ist, indem die Registrierung abgefragt wird. Wenn die .NET Framework-Version nicht installiert ist, wird der .NET Framework-Webinstaller geöffnet. Zur Unterstützung der Problembehandlung protokolliert das Skript alle Aktivitäten in einer Datei mit dem Namen „startuptasklog-(aktuelles Datum mit Uhrzeit).txt“, die unter InstallLogs lokal gespeichert ist.

    Wichtig

    Erstellen Sie die Datei „install.cmd“ in einem einfachen Texteditor wie Windows-Editor. Wenn Sie eine Textdatei mit Visual Studio erstellen und die Erweiterung in „.cmd“ ändern, kann die Datei immer noch eine UTF-8-Bytereihenfolge-Marke enthalten. Diese Marke kann einen Fehler verursachen, wenn die erste Zeile des Skripts ausgeführt wird. Um diesen Fehler zu vermeiden, versehen Sie die erste Zeile des Skripts mit einer REM-Anweisung, die von der Bytereihenfolgenverarbeitung übersprungen werden kann.

    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. Fügen Sie jeder Rolle die Datei „install.cmd“ durch Aufrufen von Hinzufügen>Vorhandenes Element im Projektmappen-Explorer hinzu (siehe die Beschreibung weiter oben).

    Nach diesem Schritt sollten alle Rollen über die .NET-Installerdateien und die Datei „install.cmd“ verfügen.

    Inhalte der Rolle mit allen Dateien

Konfigurieren der Diagnose zur Übertragung der Startaufgabenprotokolle in Blobspeicher

Zur Vereinfachung der Problembehandlung können Sie die Azure-Diagnose so konfigurieren, dass Protokolldateien, die vom Startskript oder .NET-Installer erstellt wurden, in Azure Blob Storage übertragen werden. Bei Wahl dieser Vorgehensweise können Sie die Protokolle anzeigen, indem Sie die Protokolldateien aus dem Blobspeicher herunterladen, anstatt sich per Remotedesktop bei der Rolle anzumelden.

Öffnen Sie zur Konfiguration der Diagnose die Datei „diagnostics.wadcfgx“, und fügen Sie unter dem Knoten Directories folgenden Inhalt hinzu:

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

Dieser XML-Code dient zum Konfigurieren der Diagnose zur Übertragung der Dateien im Protokollverzeichnis in der Ressource NETFXInstall in das Diagnosespeicherkonto des Blobcontainers netfx-install.

Bereitstellen des Clouddiensts

Wenn Sie Ihren Clouddienst bereitstellen, installieren die Startaufgaben .NET Framework, sofern es nicht bereits installiert ist. Ihre Clouddienstrollen haben, während das Framework installiert wird, den Status Ausgelastet. Wenn die Installation des Frameworks einen Neustart erfordert, werden möglicherweise die Dienstrollen auch neu gestartet.

Zusätzliche Ressourcen