Skip to main content

ASP.NET Core на Nano Server

Дата публикации: 31.03.2017

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 из Azure Gallery. Если у вас нет учетной записи Azure, вы можете создать бесплатную учетную запись с 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 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:\Windows\System32\inetsrv\config\applicationHost.config C:\Windows\System32\inetsrv\config\applicationHost_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:\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
}



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

Скопируйте опубликованное приложение в каталог общего доступа. Возможно, потребуется внести изменения в файл 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:\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. Программное обеспечение на виртуальном образе жесткого диска может использоваться только для целей внутренней демонстрации и тестирования. Данное программное обеспечение не предназначено для использования в производственной среде. Дату окончания действия ознакомительной версии можно узнать  здесь.

Автор статьи: Елизавета Швец

Новости

ASP.NET Core на Nano Server

This feed, No Title, currently has no items to display.
Новые статьи

ASP.NET Core на Nano Server

This feed, No Title, currently has no items to display.