ASP.NET Core на Nano Server

Представляємо першу з п'яти статей, присвячених роботі з ASP.NET Core: посібник з розгортання програми ASP.NET Core на Nano Server, IIS.



Введення
Nano Server — це варіант установки Windows Server 2016, який має більш компактний розмір і більш широкі можливості обслуговування та забезпечення безпеки порівняно з Server Core і повним варіантом установки. Більш детальна інформація наведена в офіційній документації варіанту установки Nano Server. Існує три способи почати з ним роботу:

1. Завантажити ISO-файл Windows Server 2016 Technical Preview 5 і створити образ Nano Server.
2. Завантажити Nano Server VHD для розробників.
3. Створити віртуальну машину в Azure, використовуючи образ Nano Server Online Gallery. Якщо у вас немає облікового запису Microsoft, ви можете створити безкоштовну обліковий запис з 30-денним пробним періодом.

В цьому матеріалі використовується заздалегідь створений Nano Server VHD для розробників з Windows Server Technical Preview 5.

Далі вам знадобиться створене і опубліковане 64-бітове додаток ASP.NET Core.

Підготовка примірника Nano Server
Створити нову віртуальну машину Hyper-V, використовуючи попередньо завантажений файл VHD. Перш ніж увійти в систему, необхідно вказати пароль адміністратора. Для цього потрібно натиснути клавішу F11 в консолі віртуальної машини.

Після створення пароля Nano Server може управлятися віддалено за допомогою PowerShell.

Віддалене підключення до примірника Nano Server за допомогою PowerShell
Відкрийте вікно PowerShell з підвищеними привілеями, щоб додати віддалений примірник Nano Server список
TrustedHosts
.
$nanoServerIpAddress = "10.83.181.14"
Set-Item WSMan:\localhost\Client\TrustedHosts "$nanoServerIpAddress" -Concatenate -Force

Примітка: замініть змінну
$nanoServerIpAddress
на використовуваний IP-адресу.

Після додавання примірника Nano Server список
TrustedHosts
, виконайте віддалене підключення до нього за допомогою PowerShell.
$nanoServerSession = New-PSSession -ComputerName $nanoServerIpAddress -Credential ~\Administrator
Enter-PSSession $nanoServerSession

У разі успішного підключення з'явиться командний рядок наступного виду:
[10.83.181.14]: PS C:\Users\Administrator\Documents>

Створення каталогу загального доступу
Створіть каталог загального доступу в примірнику Nano Server, щоб скопіювати в нього опубліковане додаток. У віддаленому сеансі виконайте наступні команди:
mkdir C:\PublishedApps\AspNetCoreSampleForNano
netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes
net share AspNetCoreSampleForNano=c:\PublishedApps\AspNetCoreSampleForNano /GRANT:EVERYONE`,FULL

Після виконання цих команд ви зможете відкрити каталог загального доступу, ввівши адресу
\\<nanoserver-ip-address>\AspNetCoreSampleForNano
в провіднику на хост-комп'ютері.

Відкриття порту в брандмауері
Виконайте наступні команди у віддаленому сеансі, щоб відкрити порт в брандмауері:
New-NetFirewallRule -Name "AspNet5 IIS" -DisplayName "Allow HTTP on TCP/8000" -Protocol TCP -LocalPort 8000 -Action Allow -Enabled True

Установка IIS
Додайте постачальника
NanoServerPackage
, вибравши його в колекції PowerShell. Після установки і імпорту постачальника з'явиться можливість встановлювати пакети Windows.
Виконайте наступні команди в PowerShell:
Install-PackageProvider NanoServerPackage
Import-PackageProvider NanoServerPackage
Install-NanoServerPackage -Name Microsoft-NanoServer-Storage-Package
Install-NanoServerPackage -Name Microsoft-NanoServer-IIS-Package

Після установки компонента
>Microsoft-NanoServer-Storage-Package
потрібно перезавантаження. Це тимчасова процедура і вона не буде потрібна в майбутньому.

Щоб швидко перевірити, чи коректно встановлені служби IIS, перейдіть за адресою
http://<nanoserver-ip-address>/
— повинна відобразитися стартова сторінка. При установці служб IIS створюється веб-сайт за умовчанням під назвою
Default Web Site
, для якого використовується порт 80.

Установка модуля ASP.NET Core (ANCM)
Модуль ASP.NET Core — це модуль IIS 7.5+, який відповідає за управління роботою прослушивателей (listeners) ASP.NET Core HTTP і передачу запитів до процесів, якими він керує. На даний момент установка модуля ASP.NET Core для IIS здійснюється вручну. Потрібно встановити пакунок .NET Core Windows Server Hosting на пристрій із звичайною операційною системою (не Nano Server). Після інсталяції на комп'ютер із звичайною операційною системою необхідно скопіювати наступні файли в каталог загального доступу, який був створений раніше.

На комп'ютері із звичайною операційною системою (не Nano Server) виконайте наступні команди копіювання:
copy C:\windows\system32\inetsrv\aspnetcore.dll `\\<nanoserver-ip-address>\AspNetCoreSampleForNano`
copy C:\windows\system32\inetsrv\config\schema\aspnetcore_schema.xml `\\<nanoserver-ip-address>\AspNetCoreSampleForNano`

На віртуальній машині Nano Server необхідно скопіювати наступні файли з каталогу загального доступу, який був створений раніше, відповідне розташування. Виконайте наступні команди копіювання:
copy C:\PublishedApps\AspNetCoreSampleForNano\aspnetcore.dll C:\windows\system32\inetsrv\
copy C:\PublishedApps\AspNetCoreSampleForNano\aspnetcore_schema.xml C:\windows\system32\inetsrv\config\schema\

Виконайте наступний скрипт у віддаленому сеансі:
# Backup existing applicationHost.config
copy C:\Windows\System32\inetsrv\config\applicationHost.config C:\Windows\System32\inetsrv\config\applicationHost_BeforeInstallingANCM.config

Import-Module IISAdministration

# Initialize variables
$aspNetCoreHandlerFilePath="C:\windows\system32\inetsrv\aspnetcore.dll"
Reset-IISServerManager -confirm:$false
$sm = Get-IISServerManager

# Add AppSettings section 
$sm.GetApplicationHostConfiguration().RootSectionGroup.Sections.Add("appSettings")

# Set Allow for section handlers
$appHostconfig = $sm.GetApplicationHostConfiguration()
$section = $appHostconfig.GetSection("system.webServer/handlers")
$section.OverrideMode="Allow"

# Add aspNetCore section to system.webServer
$sectionaspNetCore = $appHostConfig.RootSectionGroup.SectionGroups["system.webServer"].Sections.Add("aspNetCore")
$sectionaspNetCore.OverrideModeDefault = "Allow"
$sm.CommitChanges()

# Configure globalModule
Reset-IISServerManager -confirm:$false
$globalModules = Get-IISConfigSection "system.webServer/globalModules" | Get-IISConfigCollection
New-IISConfigCollectionElement $globalModules -ConfigAttribute @{"name"="AspNetCoreModule";"image"=$aspNetCoreHandlerFilePath}

# Configure module
$modules = Get-IISConfigSection "system.webServer/modules" | Get-IISConfigCollection
New-IISConfigCollectionElement $modules -ConfigAttribute @{"name"="AspNetCoreModule"}

# Backup existing applicationHost.config
copy C:\Windows\System32\inetsrv\config\applicationHost.config C:\Windows\System32\inetsrv\config\applicationHost_AfterInstallingANCM.config

Примітка: видаліть файли
aspnetcore.dll
та
aspnetcore_schema.xml
з каталогу загального доступу після завершення попереднього кроку.

Установка .NET Framework Core
Якщо ви опублікували переноситься додаток, платформа .NET Core повинна бути встановлена на цільовому комп'ютері. Виконайте такі скрипти у віддаленому сеансі Powershell, щоб встановити .NET Framework на віртуальній машині Nano Server:
$SourcePath = "https://go.microsoft.com/fwlink/?LinkID=809115"
$DestinationPath = "C:\dotnet"

$EditionId = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'EditionID').EditionId

if (($EditionId -eq "ServerStandardNano") -or
($EditionId -eq "ServerDataCenterNano") -or
($EditionId -eq "NanoServer") -or
($EditionId -eq "ServerTuva")) {

$TempPath = [System.IO.Path]::GetTempFileName()
if (($SourcePath -as [System.URI]).AbsoluteURI -ne $null)
{
$handler = New Object System.Net.Http.HttpClientHandler
$client = New Object System.Net.Http.HttpClient($handler)
$client.Timeout = New Object System.TimeSpan(0, 30, 0)
$cancelTokenSource = [System.Threading.CancellationTokenSource]::new()
$responseMsg = $client.GetAsync([System.Uri]::new($SourcePath), $cancelTokenSource.Token)
$responseMsg.Wait()
if (!$responseMsg.IsCanceled)
{
$response = $responseMsg.Result
if ($response.IsSuccessStatusCode)
{
$downloadedFileStream = [System.IO.FileStream]::new($TempPath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
$copyStreamOp = $response.Content.CopyToAsync($downloadedFileStream)
$copyStreamOp.Wait()
$downloadedFileStream.Close()
if ($copyStreamOp.Exception -ne $null)
{
throw $copyStreamOp.Exception
}
}
}
}
else
{
throw "Cannot copy from $SourcePath"
}
[System.IO.Compression.ZipFile]::ExtractToDirectory($TempPath, $DestinationPath)
Remove-Item $Temp</code>
Path
}

Публікація програми
Скопіюйте опубліковане додаток в каталог загального доступу.
Можливо, потрібно буде внести зміни в файл
веб.config
, щоб вказати каталог, в який витягнутий файл
dotnet.exe
. Інший спосіб — скопіювати файл
dotnet.exe
в той же каталог.

Приклад файлу
веб.config
в ситуації, коли файл
dotnet.exe
не скопійований в той же каталог:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path=".*" verb=".*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="C:\dotnet\dotnet.exe" arguments=".\AspNetCoreSampleForNano.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="true" />
</system.webServer>
</configuration>

Виконайте наступні команди у віддаленій сесії, щоб створити новий веб-сайт в IIS для опублікованого програми. У цьому скрипті для спрощення використовується
DefaultAppPool
. Більш докладна інформація про роботу з пулом додатків наведена в статті Application Pools.
Import-module IISAdministration
New-IISSite -Name "AspNetCore" -PhysicalPath c:\PublishedApps\AspNetCoreSampleForNano -BindingInformation "*:8000:"

Відома проблема в роботі .NET Core CLI у Nano Server і спосіб її обходу
Якщо використовується Nano Server Technical Preview 5 c .NET Core CLI, необхідно скопіювати файли DLL з каталогу
c:\windows\system32\forwarders
в каталог
c:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.0.0\
та в каталог двійкових файлів
.NET Core c:\dotnet
(в даному прикладі). Це викликано помилкою, яка фіксується в більш нових версіях.

Якщо використовується команда
dotnet publish
, скопіюйте файли DLL з каталогу
c:\windows\system32\forwarders
в каталог публікації.

Якщо система Nano Server Technical Preview 5 була оновлена або змінена, повторіть цю процедуру, так як файли DLL також могли бути оновлені.

Запуск програми
Опубліковане веб-додаток повинен бути доступний у браузері за адресою
http://<nanoserver-ip-address>:8000
. Якщо ведення журналу налаштовано так, як зазначено в розділі Створення і перенаправлення логів, всі журнали доступні в каталозі
C:\PublishedApps\AspNetCoreSampleForNano\logs
.

В цьому матеріалі використовується попередній випуск варіанти установки Nano Server, який доступний в Windows Server Technical Preview 5. Програмне забезпечення на віртуальному образі жорсткого диска може використовуватися лише для цілей внутрішньої демонстрації і тестування. Це програмне забезпечення призначене для використання у виробничому середовищі. Дату закінчення дії ознайомлювальної версії можна дізнатися тут.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.