Menginstal .NET di peran Azure Cloud Services (klasik)

Penting

Cloud Services (klasik) sekarang tidak lagi digunakan untuk pelanggan baru dan akan dihentikan untuk semua pelanggan pada 31 Agustus 2024. Penyebaran baru sebaiknya menggunakan Azure Resource Manager yang baru berdasarkan model penyebaran Azure Cloud Services (dukungan tambahan) .

Artikel ini menjelaskan cara menginstal versi .NET Framework yang tidak dilengkapi dengan OS Tamu Azure. Anda dapat menggunakan .NET pada OS Tamu untuk mengonfigurasi peran web dan pekerja layanan awan Anda.

Misalnya, Anda dapat menginstal .NET Framework 4.6.2 pada keluarga OS Tamu 4, yang tidak dilengkapi dengan rilis .NET Framework 4.6. (Keluarga OS Tamu 5 dilengkapi dengan .NET Framework 4.6.) Untuk informasi terbaru tentang rilis OS Tamu Azure, lihat berita rilis Azure Guest OS.

Penting

Azure SDK 2.9 berisi pembatasan penerapan .NET Framework 4.6 pada keluarga OS Tamu 4 atau versi lebih lama. Perbaikan untuk pembatasan tersedia di azure-cloud-services-filesrepositori GitHub.

Untuk menginstal .NET di peran web dan pekerja Anda, sertakan alat penginstal web .NET sebagai bagian dari proyek layanan awan Anda. Mulai alat penginstal sebagai bagian dari tugas startup peran.

Menambahkan alat penginstal .NET ke proyek Anda

Untuk mengunduh alat penginstal web untuk .NET Framework, pilih versi yang ingin Anda pasang:

Untuk menambahkan penginstal untuk peran web:

  1. Di Penjelajah Solusi, di bawah Peran dalam proyek layanan awan Anda, klik kanan pada peran web Anda dan pilih Tambahkan>Folder Baru. Membuat folder bernama bin.
  2. Klik kanan folder bin dan pilih Tambahkan>Item yang Ada. Pilih alat penginstal .NET dan tambahkan ke folder bin.

Untuk menambahkan alat penginstal untuk peran pekerja:

  • Klik kanan peran pekerja Anda dan pilih Tambahkan>Item yang Ada. Pilih alat penginstal .NET dan tambahkan ke peran.

Saat file ditambahkan dengan cara ini ke folder konten peran, file secara otomatis ditambahkan ke paket layanan awan Anda. File kemudian disebarkan ke lokasi yang konsisten pada komputer virtual. Ulangi proses ini untuk setiap peran web dan pekerja di layanan awan Anda sehingga semua peran memiliki salinan alat penginstal.

Catatan

Anda harus menginstal .NET Framework 4.6.2 pada peran layanan awan Anda bahkan jika aplikasi Anda menargetkan .NET Framework 4.6. OS Tamu mencakup pembaruan 3098779 dan pembaruan 3097997 Pangkalan Pengetahuan. Masalah dapat terjadi ketika Anda menjalankan aplikasi .NET Anda jika .NET Framework 4.6 dipasang di atas pembaruan Pangkalan Pengetahuan. Untuk menghindari masalah ini, pasang .NET Framework 4.6.2 daripada versi 4.6. Untuk informasi selengkapnya, lihat artikel Pangkalan Pengetahuan 3118750 dan 4340191.

Konten peran dengan file alat penginstal

Menentukan tugas startup untuk peran Anda

Anda bisa menggunakan tugas startup untuk melakukan operasi sebelum peran dimulai. Menginstal .NET Framework sebagai bagian dari tugas startup memastikan bahwa kerangka kerja diinstal sebelum kode aplikasi apa pun dijalankan. Untuk informasi selengkapnya tentang tugas startup, lihat Menjalankan tugas startup di Azure.

  1. Tambahkan konten berikut ke file ServiceDefinition.csdef di bawah node WebRole atau WorkerRole untuk semua peran:

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

    Konfigurasi sebelumnya menjalankan perintah konsol install.cmd dengan hak administrator untuk menginstal .NET Framework. Konfigurasi ini juga membuat elemen LocalStorage bernama NETFXInstall. Skrip startup menetapkan folder sementara untuk menggunakan sumber daya penyimpanan lokal ini.

    Penting

    Untuk memastikan penginstalan kerangka kerja yang benar, atur ukuran sumber daya ini menjadi setidaknya 1.024 MB.

    Untuk informasi selengkapnya tentang tugas startup, lihat Tugas Umum Startup Azure Cloud Services.

  2. Buat file bernama install.cmd dan tambahkan skrip penginstalan berikut ke file.

    Skrip memeriksa apakah versi yang ditentukan dari .NET Framework sudah diinstal pada mesin dengan menanyakan registri. Jika versi .NET Framework tidak diinstal, maka alat penginstal web .NET Framework dibuka. Untuk membantu memecahkan masalah apa pun, skrip mencatat semua aktivitas ke file startuptasklog-(tanggal dan waktu saat ini).txt yang disimpan di penyimpanan lokal InstallLogs.

    Penting

    Gunakan editor teks dasar seperti Windows Notepad untuk membuat file install.cmd. Jika Anda menggunakan Visual Studio untuk membuat file teks dan mengubah ekstensi menjadi .cmd, file mungkin masih berisi tanda urutan byte UTF-8. Tanda ini dapat menyebabkan kesalahan ketika baris pertama skrip dijalankan. Untuk menghindari kesalahan ini, buat baris pertama skrip pernyataan REM yang dapat dilewati oleh pemrosesan urutan byte.

    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. Tambahkan file install.cmd ke setiap peran dengan menggunakan Tambahkan>Item yang Sudah Ada di Penjelajah Solusi seperti yang dijelaskan sebelumnya dalam topik ini.

    Setelah langkah ini selesai, semua peran harus memiliki file alat penginstal .NET dan file install.cmd.

    Konten peran dengan semua file

Mengonfigurasi Diagnostik untuk mentransfer log startup ke penyimpanan Blob

Untuk menyederhanakan pemecahan masalah penginstalan, Anda dapat mengonfigurasi Diagnostik Azure untuk mentransfer file log apa pun yang dihasilkan oleh skrip startup atau alat penginstal .NET ke penyimpanan Azure Blob. Dengan menggunakan pendekatan ini, Anda dapat melihat log dengan mengunduh file log dari penyimpanan Blob daripada harus menggunakan desktop jauh ke dalam peran.

Untuk mengonfigurasi Diagnostik, buka file diagnostics.wadcfgx dan tambahkan konten berikut di bawah node Direktori:

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

XML ini mengonfigurasi Diagnostik untuk mentransfer file dalam direktori log di sumber daya NETFXInstall ke akun penyimpanan Diagnostik di kontainer bolb netfx-install.

Menerapkan layanan awan Anda

Saat Anda menerapkan layanan awan Anda, tugas startup menginstal .NET Framework jika belum diinstal. Peran layanan awan Anda berada dalam kondisi sibuk saat kerangka kerja sedang diinstal. Jika penginstalan kerangka kerja memerlukan mulai ulang, peran layanan mungkin juga dimulai ulang.

Sumber Daya Tambahan: