Серверы

Steve Smith

ASP.NET Core полностью отделен от веб серверов, на которых хостится приложение. ASP.NET Core поддерживает IIS и IIS Express, WebListener и Kestrel, которые запускаются на разных платформах. Разработчики могут создавать свои собственные веб серверы, где будут разворачивать свои ASP.NET Core приложения.

Просмотрите или скачайте пример с GitHub.

Серверы и команды

В ASP.NET Core веб приложение отделено от веб сервера, на котором оно хостится. Традиционно ASP.NET приложения работали только под Windows и размещались на встроенном веб сервере для Windows, Internet Information Server (IIS). Мы рекомендуем запускать ASP.NET Core приложения для Windows с помощью IIS в качестве резервного прокси-сервера. Модуль HttpPlatformHandler в IIS управляет запросами к HTTP серверу, которые хостятся вне процесса. ASP.NET Core предлагает два HTTP сервера:

  • Microsoft.AspNetCore.Server.WebListener (AKA WebListener, Windows-only, preview)
  • Microsoft.AspNet.Server.Kestrel (Kestrel)

ASP.NET Core напрямую не принимает запросы, а вместо этого работает с HTTP сервером, чтобы передать запрос приложению как набор интерфейсов feature, встроенных в HttpContext. IIS и WebListener предназначены только для Windows; Kestrel же является кроссплатформенным сервером. Вы можете настроить приложение таким образом, чтобы его можно было размещать на любом из этих серверов, указав нужные команды в файле project.json. Вы также можете указать точку входа приложения и запустить его с помощью dotnet run.

Сервером по умолчанию для ASP.NET приложений, разработанных в Visual Studio, является IIS Express в качестве резервного прокси-сервера для Kestrel. Зависимости “Microsoft.AspNet.Server.Kestrel” и “Microsoft.AspNet.IISPlatformHandler” включены в project.json по умолчанию, даже в шаблон Empty. Visual Studio поддерживает несколько профилей, связанных с IIS Express и любыми другими. Вы можете управлять этими профилями и их настройками во вкладке Debug меню Properties или из файла launchSettings.json.

../_images/serverdemo-properties.png

Я настроил пример для этой статьи таким образом, чтобы вы могли рассмотреть разные серверные опции в файле project.json:

project.json (truncated)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "webroot": "wwwroot",
  "version": "1.0.0-*",

  "dependencies": {
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.Server.WebListener": "1.0.0-rc1-final"
  },

  "commands": {
    "run": "run server.urls=http://localhost:5003",
    "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5000",
    "weblistener": "Microsoft.AspNet.Hosting --server WebListener --server.urls http://localhost:5004"
  },

  "frameworks": {
    "dnx451": { },

Команда run запускает приложение из метода void main(). Команда run запускает экземпляр Kestrel.

program.cs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Threading.Tasks;
using Microsoft.AspNet.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNet.Builder;
using Microsoft.Extensions.Logging;
using Microsoft.AspNet.Server.Kestrel;

namespace ServersDemo
{
    /// <summary>
    /// This demonstrates how the application can be launched in a console application. 
    /// Executing the "dnx run" command in the application folder will run this app.
    /// </summary>
    public class Program
    {
        private readonly IServiceProvider _serviceProvider;

        public Program(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public Task<int> Main(string[] args)
        {
            //Add command line configuration source to read command line parameters.
            var builder = new ConfigurationBuilder();
            builder.AddCommandLine(args);
            var config = builder.Build();

            using (new WebHostBuilder(config)
                .UseServer("Microsoft.AspNet.Server.Kestrel")
                .Build()
                .Start())
            {
                Console.WriteLine("Started the server..");
                Console.WriteLine("Press any key to stop the server");
                Console.ReadLine();
            }
            return Task.FromResult(0);
        }
    }
}

Функционал серверов

ASP.NET поддерживает определенные Элементы Features, которые работают при различных серверных реализациях. В следующей таблице представлены различные элементы Feature для WebListener и Kestrel.

Feature WebListener Kestrel
IHttpRequestFeature Да Да
IHttpResponseFeature Да Да
IHttpAuthenticationFeature Да Нет
IHttpUpgradeFeature Да (с ограничениями) Да
IHttpBufferingFeature Да Нет
IHttpConnectionFeature Да Нет
IHttpRequestLifetimeFeature Да Нет
IHttpSendFileFeature Да Нет
IHttpWebSocketFeature Да Нет*
IRequestIdentifierFeature Да Нет
ITlsConnectionFeature Да Нет
ITlsTokenBindingFeature Да Нет

Чтобы добавить веб сокеты, используйте WebSocketMiddleware <https://github.com/aspnet/WebSockets/blob/1.0.0-rc1/src/Microsoft.AspNet.WebSockets.Server/WebSocketMiddleware.cs>

Опции конфигурации

Вы можете передать опции конфигурации (через параметры командной строки или конфигурационный файл), которые считываются при запуске сервера.

Команда Microsoft.AspNet.Hosting поддерживает параметры сервера (например, Kestrel или WebListener) и конфигурационный ключ server.urls. Конфигурационный ключ server.urls - это список URL префиксов, разделенных точкой с запятой, которые должен обработать сервер.

С помощью файла project.json я показал вам, как напрямую передавать параметр server.urls:

"web": "Microsoft.AspNet.Kestrel --server.urls http://localhost:5004"

Вместо этого вы можете использовать конфигурационный файл JSON:

"kestrel": "Microsoft.AspNet.Hosting"

Далее, hosting.json может включать в себя настройки, которые будет использовать сервер:

{
  "server": "Microsoft.AspNet.Server.Kestrel",
  "server.urls": "http://localhost:5004/"
}

Настройка сервера программным образом

К серверу, на котором хостится приложение, можно получить доступ программным образом через интерфейс IApplicationBuilder из метода Configure в Startup. IApplicationBuilder предлагает элементы Server Features типа IFeatureCollection. IServerAddressesFeature раскрывает только свойство Addresses, но другие серверные реализации могут раскрывать и другой функционал. Например, WebListener предлагает AuthenticationManager, который можно использовать для настройки серверной аутентификации:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public void Configure(IApplicationBuilder app, IApplicationLifetime lifetime, ILoggerFactory loggerFactory)
{
    var webListenerInfo = app.ServerFeatures.Get<WebListener>();
    if (webListenerInfo != null)
    {
        webListenerInfo.AuthenticationManager.AuthenticationSchemes =
            AuthenticationSchemes.AllowAnonymous;
    }

    var serverAddress = app.ServerFeatures.Get<IServerAddressesFeature>()?.Addresses.FirstOrDefault();

    app.Run(async (context) =>
    {
        var message = String.Format("Hello World from {0}",
                                serverAddress);
        await context.Response.WriteAsync(message);
    });
}

IIS и IIS Express

IIS - это сервер с наиболее богатым функционалом, и он имеет доступ к другим IIS модулям. При хостинге ASP.NET Core больше не используется инфраструктура System.Web, которая использовалась в предыдущих версиях ASP.NET.

ASP.NET Core Module

В ASP.NET Core для Windows веб приложение хостится вне IIS. ASP.NET Core Module является родным модулем IIS, который используется для прокси запросов ко внешним процессам. См. ASP.NET Core Module Configuration Reference.

WebListener

WebListener - это HTTP сервер только для Windows для ASP.NET Core. Он запускается напрямую в kernel драйвере Http.Sys.

Вы можете добавить поддержку WebListener в ASP.NET приложение, добавив зависимость “Microsoft.AspNet.Server.WebListener” в project.json и используя следующую команду:

"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"

Примечание

На данный момент существует предварительная версия WebListener.

Kestrel

Kestrel - это кроссплатформенный веб сервер, основанный на libuv, кроссплатформенной I/O библиотеке. Вы можете добавить поддержку Kestrel, включив Microsoft.AspNet.Server.Kestrel в зависимости проекта, перечисленные в файле project.json..

См. Ваше первое ASP.NET Core приложение на Mac.

Примечание

Kestrel работает за прокси (например, IIS или Nginx), и его не надо использовать напрямую с Internet.

Выбор сервера

Если вы разворачиваете приложение на Windows сервере, то вам стоит запустить IIS в качестве резервного прокси сервера, который управляет запросами к Kestrel. При публикации приложения на Linux, вам нужно запустить соответствующий резервный прокси сервер, например, Apache или Nginx, для запросов к Kestrel (см. Publish to a Linux Production Environment).

Пользовательские серверы

Вы можете создать собственный сервер для хостинга ASP.NET приложений или использовать другой сервер с открытым исходным кодом. Вы можете изменить KestrelHttpServer - и это самый быстрый способ создания пользовательского сервера. При использовании собственного сервера вы можете реализовать любые интерфейсы, которые нужны вашему приложению, хотя, как минимум, серверы должны поддерживать IHttpRequestFeature и IHttpResponseFeature.

Kestrel на данный момент поддерживает некоторые интерфейсы Feature, а дополнительные элементы будут добавлены позже.

Поделись хорошей новостью с друзьями!
Следи за новостями!