- PVSM.RU - https://www.pvsm.ru -

ASP.NET Core на Nano Server

Представляем первую из пяти статей, посвященных работе с ASP.NET Core: руководство по развертыванию приложения ASP.NET Core на Nano Server со службами IIS.

ASP.NET Core на Nano Server - 1

Введение

Nano Server — это вариант установки Windows Server 2016, который имеет более компактный размер и более широкие возможности обслуживания и обеспечения безопасности по сравнению с Server Core и полным вариантом установки. Более подробная информация приведена в официальной документации [1] по варианту установки Nano Server. Существует три способа начать с ним работу:

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

В данном материале используется заранее созданный Nano Server VHD для разработчиков [2] из Windows Server Technical Preview 5.

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

Подготовка экземпляра Nano Server

Создайте [4] новую виртуальную машину Hyper-V, используя предварительно загруженный файл VHD. Прежде чем войти в систему, необходимо задать пароль администратора. Для этого нужно нажать клавишу F11 в консоли виртуальной машины.

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

Удаленное подключение к экземпляру Nano Server при помощи PowerShell

Откройте окно PowerShell с повышенными привилегиями, чтобы добавить удаленный экземпляр Nano Server в список TrustedHosts.

$nanoServerIpAddress = "10.83.181.14"
Set-Item WSMan:localhostClientTrustedHosts "$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:UsersAdministratorDocuments>

Создание каталога общего доступа

Создайте каталог общего доступа в экземпляре Nano Server, чтобы скопировать в него опубликованное приложение. В удаленном сеансе выполните следующие команды:

mkdir C:PublishedAppsAspNetCoreSampleForNano
netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes
net share AspNetCoreSampleForNano=c:PublishedAppsAspNetCoreSampleForNano /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 [5] на устройство с обычной операционной системой (не Nano Server). После установки пакета на компьютер с обычной операционной системой необходимо скопировать следующие файлы в каталог общего доступа, который был создан ранее.

На компьютере с обычной операционной системой (не Nano Server) выполните следующие команды копирования:

copy C:windowssystem32inetsrvaspnetcore.dll ``\<nanoserver-ip-address>AspNetCoreSampleForNano``
copy C:windowssystem32inetsrvconfigschemaaspnetcore_schema.xml ``\<nanoserver-ip-address>AspNetCoreSampleForNano``

На виртуальной машине Nano Server необходимо скопировать следующие файлы из каталога общего доступа, который был создан ранее, в соответствующее расположение. Выполните следующие команды копирования:

copy C:PublishedAppsAspNetCoreSampleForNanoaspnetcore.dll C:windowssystem32inetsrv
copy C:PublishedAppsAspNetCoreSampleForNanoaspnetcore_schema.xml C:windowssystem32inetsrvconfigschema

Выполните следующий скрипт в удаленном сеансе:

# Backup existing applicationHost.config
copy C:WindowsSystem32inetsrvconfigapplicationHost.config C:WindowsSystem32inetsrvconfigapplicationHost_BeforeInstallingANCM.config

Import-Module IISAdministration

# Initialize variables
$aspNetCoreHandlerFilePath="C:windowssystem32inetsrvaspnetcore.dll"
Reset-IISServerManager -confirm:$false
$sm = Get-IISServerManager

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

# Set Allow for handlers section
$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:WindowsSystem32inetsrvconfigapplicationHost.config C:WindowsSystem32inetsrvconfigapplicationHost_AfterInstallingANCM.config

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

Установка .NET Core Framework

Если вы опубликовали переносимое приложение, платформа .NET Core должна быть установлена на целевом компьютере. Выполните следующие скрипты в удаленном сеансе Powershell, чтобы установить .NET Framework на виртуальной машине Nano Server:

$SourcePath = "https://go.microsoft.com/fwlink/?LinkID=809115"
$DestinationPath = "C:dotnet"

$EditionId = (Get-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindows NTCurrentVersion' -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
}

Публикация приложения

Скопируйте опубликованное приложение в каталог общего доступа.
Возможно, потребуется внести изменения в файл web.config, чтобы указать каталог, в который извлечен файл dotnet.exe. Другой способ — скопировать файл dotnet.exe в тот же каталог.

Пример файла web.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:dotnetdotnet.exe" arguments=".AspNetCoreSampleForNano.dll" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" forwardWindowsAuthToken="true" />
 </system.webServer>
</configuration>

Выполните следующие команды в удаленной сессии, чтобы создать новый веб-сайт в IIS для опубликованного приложения. В этом скрипте для упрощения используется DefaultAppPool. Более подробная информация о работе с пулом приложений приведена в статье Application Pools [6].

Import-module IISAdministration
New-IISSite -Name "AspNetCore" -PhysicalPath c:PublishedAppsAspNetCoreSampleForNano -BindingInformation "*:8000:"

Известная проблема в работе .NET Core CLI в Nano Server и способ ее обхода

Если используется Nano Server Technical Preview 5 c .NET Core CLI, необходимо скопировать файлы DLL из каталога c:windowssystem32forwarders в каталог c:Program FilesdotnetsharedMicrosoft.NETCore.App1.0.0 и в каталог двоичных файлов .NET Core c:dotnet (в данном примере). Это вызвано ошибкой, которая устранена в более новых версиях.

Если используется команда dotnet publish, скопируйте также файлы DLL из каталога c:windowssystem32forwarders в каталог публикации.

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

Запуск приложения

Опубликованное веб-приложение должно быть доступно в браузере по адресу http://<nanoserver-ip-address>:8000. Если ведение журнала сконфигурировано так, как указано в разделе Создание и перенаправление логов [7], все журналы доступны в каталоге C:PublishedAppsAspNetCoreSampleForNanologs.

В данном материале используется предварительный выпуск варианта установки Nano Server, который доступен в Windows Server Technical Preview 5. Программное обеспечение на виртуальном образе жесткого диска может использоваться только для целей внутренней демонстрации и тестирования. Данное программное обеспечение не предназначено для использования в производственной среде. Дату окончания действия ознакомительной версии можно узнать здесь [8].

Автор: Microsoft

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/microsoft/192500

Ссылки в тексте:

[1] документации: https://technet.microsoft.com/en-us/library/mt126167.aspx

[2] Nano Server VHD для разработчиков: https://msdn.microsoft.com/en-us/virtualization/windowscontainers/nano_eula

[3] опубликованное: https://docs.asp.net/en/latest/publishing/index.html

[4] Создайте: https://technet.microsoft.com/en-us/library/hh846766.aspx

[5] .NET Core Windows Server Hosting: https://dot.net/

[6] Application Pools: https://docs.asp.net/en/latest/hosting/apppool.html#apppool

[7] Создание и перенаправление логов: https://docs.asp.net/en/latest/hosting/aspnet-core-module.html#log-redirection

[8] здесь: https://go.microsoft.com/fwlink/?LinkId=624232

[9] Источник: https://habrahabr.ru/post/310996/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best