Installera .NET på Azure Cloud Services-roller (klassiska)

Viktigt

Cloud Services (klassisk) är nu inaktuell för nya kunder och kommer att dras tillbaka den 31 augusti 2024 för alla kunder. Nya distributioner bör använda den nya Azure Resource Manager-baserade distributionsmodellen Azure Cloud Services (utökad support).

Den här artikeln beskriver hur du installerar versioner av .NET Framework som inte medföljer Azure Guest OS. Du kan använda .NET i gästoperativsystemet för att konfigurera webb- och arbetsroller för molntjänster.

Du kan till exempel installera .NET Framework 4.6.2 i gästoperativsystemets familj 4, som inte har någon version av .NET Framework 4.6. (Gästoperativsystemfamiljen 5 levereras med .NET Framework 4.6.) Den senaste informationen om Azure Guest OS-versionerna finns i nyheter om Azure Guest OS-versionen.

Viktigt

Azure SDK 2.9 innehåller en begränsning för att distribuera .NET Framework 4.6 i gästoperativsystemets familj 4 eller tidigare. En korrigering av begränsningen är tillgänglig på GitHub-lagringsplatsenazure-cloud-services-files.

Om du vill installera .NET på dina webb- och arbetsroller inkluderar du .NET-webbinstallationen som en del av molntjänstprojektet. Starta installationsprogrammet som en del av rollens startuppgifter.

Lägg till .NET-installationsprogrammet i projektet

Om du vill ladda ned webbinstallationsprogrammet för .NET Framework väljer du den version som du vill installera:

Så här lägger du till installationsprogrammet för en webbroll :

  1. I Solution Explorer högerklickar du på webbrollen under Roller i molntjänstprojektet och väljer Lägg till>ny mapp. Skapa en mapp med namnet bin.
  2. Högerklicka på mappen bin och välj Lägg till>befintligt objekt. Välj .NET-installationsprogrammet och lägg till det i mappen bin.

Så här lägger du till installationsprogrammet för en arbetsroll :

  • Högerklicka på arbetsrollen och välj Lägg till>befintligt objekt. Välj .NET-installationsprogrammet och lägg till det i rollen.

När filer läggs till på det här sättet i rollinnehållsmappen läggs de automatiskt till i molntjänstpaketet. Filerna distribueras sedan till en konsekvent plats på den virtuella datorn. Upprepa den här processen för varje webb- och arbetsroll i molntjänsten så att alla roller har en kopia av installationsprogrammet.

Anteckning

Du bör installera .NET Framework 4.6.2 på molntjänstrollen även om ditt program har som mål .NET Framework 4.6. Gästoperativsystemet innehåller kunskapsbasuppdateringen 3098779 och uppdatering 3097997. Problem kan uppstå när du kör .NET-program om .NET Framework 4.6 är installerat ovanpå Knowledge Base-uppdateringarna. Undvik dessa problem genom att installera .NET Framework 4.6.2 i stället för version 4.6. Mer information finns i kunskapsbasartikeln 3118750 och 4340191.

Rollinnehåll med installationsfiler

Definiera startuppgifter för dina roller

Du kan använda startuppgifter för att utföra åtgärder innan en roll startar. Genom att installera .NET Framework som en del av startuppgiften ser du till att ramverket installeras innan någon programkod körs. Mer information om startuppgifter finns i Köra startuppgifter i Azure.

  1. Lägg till följande innehåll i filen ServiceDefinition.csdef under noden WebRole eller WorkerRole för alla roller:

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

    Den föregående konfigurationen kör konsolkommandot install.cmd med administratörsbehörighet för att installera .NET Framework. Konfigurationen skapar också ett LocalStorage-element med namnet NETFXInstall. Startskriptet anger att temp-mappen ska använda den här lokala lagringsresursen.

    Viktigt

    För att säkerställa korrekt installation av ramverket anger du storleken på den här resursen till minst 1 024 MB.

    Mer information om startuppgifter finns i Vanliga Startuppgifter för Azure Cloud Services.

  2. Skapa en fil med namnet install.cmd och lägg till följande installationsskript i filen.

    Skriptet kontrollerar om den angivna versionen av .NET Framework redan är installerad på datorn genom att fråga registret. Om den .NET Framework versionen inte är installerad öppnas .NET Framework webbinstallationsprogrammet. För att felsöka eventuella problem loggar skriptet all aktivitet till filen startuptasklog-(aktuellt datum och tid).txt som lagras i InstallLogs lokala lagring.

    Viktigt

    Använd en grundläggande textredigerare som Windows Notepad för att skapa filen install.cmd. Om du använder Visual Studio för att skapa en textfil och ändra tillägget till .cmd kan filen fortfarande innehålla en UTF-8 byteordningsmarkering. Det här märket kan orsaka ett fel när den första raden i skriptet körs. Undvik det här felet genom att göra den första raden i skriptet till en REM-instruktion som kan hoppas över av byteorderbearbetningen.

    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. Lägg till filen install.cmd i varje roll med hjälp av Lägg till>befintligt objekt i Solution Explorer enligt beskrivningen tidigare i det här avsnittet.

    När det här steget är klart bör alla roller ha .NET-installationsfilen och filen install.cmd.

    Rollinnehåll med alla filer

Konfigurera diagnostik för att överföra startloggar till Blob Storage

För att förenkla felsökningen av installationsproblem kan du konfigurera Azure Diagnostics att överföra loggfiler som genereras av startskriptet eller .NET-installationsprogrammet till Azure Blob Storage. Med den här metoden kan du visa loggarna genom att ladda ned loggfilerna från Blob Storage i stället för att behöva fjärrskrivbord till rollen.

Om du vill konfigurera diagnostik öppnar du filen diagnostics.wadcfgx och lägger till följande innehåll under noden Kataloger :

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

Den här XML-koden konfigurerar diagnostik för att överföra filerna i loggkatalogen i NETFXInstall-resursen till diagnostiklagringskontot i blobcontainern netfx-install .

Distribuera din molntjänst

När du distribuerar molntjänsten installerar startuppgifterna .NET Framework om den inte redan är installerad. Dina molntjänstroller är i ett upptaget tillstånd medan ramverket installeras. Om ramverksinstallationen kräver en omstart kan även tjänstrollerna startas om.

Ytterligare resurser