В цій статті
ASP.NET Core - це нова кроссплатформенная середа з відкритим кодом для створення сучасних хмарних додатків з підключенням до Інтернету, таких як веб-додатки, додатки для Інтернету речей і серверні частини мобільних додатків.
Довідник з основних функцій по ASP.NET Core в Service Fabric і інструкції по налаштуванню середовища розробки см. В статті Створення зовнішнього інтерфейсу веб-служби для застосування за допомогою ASP.NET Core.
ASP.NET Core в середовищі Service Fabric
Хоча додатки ASP.NET Core можна запускати на .NET Core або повної версії платформи .NET Framework, служби Service Fabric в даний час можуть працювати тільки на повній версії .NET Framework. Це означає, що при створенні служби ASP.NET Core Service Fabric як і раніше необхідно орієнтуватися на повну версію .NET Framework.
ASP.NET Core можна використовувати двома різними способами в Service Fabric:
- Розмістити у вигляді гостьового виконуваного файлу. В основному це використовується для запуску існуючих додатків ASP.NET Core в Service Fabric без зміни коду.
- Виконувати всередині надійної служби. Це забезпечує більш ефективну інтеграцію із середовищем виконання Service Fabric і дозволяє використовувати служби ASP.NET Core з відстеженням стану.
Далі в цій статті пояснюється, як використовувати ASP.NET Core всередині Reliable Service за допомогою компонентів інтеграції ASP.NET, що поставляються з пакетом SDK для Service Fabric.
Розміщення служби Service Fabric
В Service Fabric один або кілька примірників і (або) реплік служби виконуються в хост-процесі служби - виконуваному файлі, який виконує код служби. Творцеві служби належить хост-процес служби, який Service Fabric активує і відстежує.
Зазвичай ASP.NET (до MVC 5) тісно пов'язаний з IIS через System.Web.dll. ASP.NET Core розділяє веб-сервер і веб-додаток. Це дозволяє переносити веб-додаток між різними веб-серверами, а також дозволяє веб-серверам бути автономно розміщеними. Це означає, що веб-сервер можна запустити у власному процесі, на відміну від процесу, який належить виділеному ПО веб-сервера, такого як IIS.
Щоб об'єднати службу Service Fabric і ASP.NET в Reliable Service або в якості гостьового виконуваного додатка, необхідно запустити ASP.NET в хост-процесі служби. Автономне розміщення ASP.NET Core дозволяє це зробити.
Розміщення ASP.NET Core в Reliable Service
Як правило, автономно розміщуються додатки ASP.NET Core створюють WebHost в точці входу додатки, наприклад метод static void Main () в Program.cs. В такому випадку життєвий цикл WebHost прив'язаний до життєвого циклу процесу.
Точка входу програми не підходить для створення WebHost в Reliable Service, так як вона використовується тільки для реєстрації типу служби в середовищі виконання Reliable Service, щоб мати можливість створювати екземпляри цього типу служби. WebHost повинен бути створений в Reliable Service автоматично. В хост-процесі служби екземпляри служби та (або) репліки можуть проходити кілька життєвих циклів.
Примірник Reliable Service представлений за допомогою класу служби, похідного від StatelessService або StatefulService. Стек зв'язку для роботи полягає в реалізації ICommunicationListener класу служби. Пакети NuGet Microsoft.ServiceFabric.Services.AspNetCore. * Містять реалізації ICommunicationListener. які запускають і адмініструють ASP.NET Core WebHost для Kestrel або WebListener в Reliable Service.
Об'єкти ICommunicationListener в ASP.NET Core
Реалізації ICommunicationListener Kestrel і WebListener в пакетах NuGet Microsoft.ServiceFabric.Services.AspNetCore. * Мають схожі шаблони використання, але виконують кілька різні дії для кожного веб-сервера.
Обидва Прослуховувач зв'язку надають конструктор, який приймає такі аргументи:
ПО проміжного рівня для інтеграції Service Fabric
Причина помилковий ідентифікації
Це може періодично викликати помилки, які важко діагностувати.
Щоб уникнути цього служби можуть розмістити кінцеву точку в службі імен з унікальним ідентифікатором, а потім перевіряти його під час обробки клієнтських запитів. Це спільна дія між службами в довіреної середовищі дружнього клієнта. Це не забезпечує безпечну перевірку справжності служби в середовищі недружнього клієнта.
Служби, які використовують динамічно призначається порт, повинні використовувати це ПЗ проміжного шару.
Служби, які використовують постійний унікальний порт, не мають такої проблеми в спільній середовищі. Постійний унікальний порт зазвичай використовується для зовнішніх служб, яким необхідний відомий порт для підключення клієнтських додатків. Наприклад, більшість веб-додатків з доступом до Інтернету використовують порт 80 або 443 для підключень веб-браузера. У цьому випадку не слід включати унікальний ідентифікатор.
На схемі нижче показаний потік запиту з включеним ПО проміжного шару.
WebListener в службах Reliable Services
WebListener можна використовувати в Reliable Service, імпортувавши пакет NuGet Microsoft.ServiceFabric.AspNetCore.WebListener. Цей пакет містить WebListenerCommunicationListener. реалізацію ICommunicationListener. яка дозволяє створювати WebHost ASP.NET Core всередині Reliable Service за допомогою WebListener як веб-сервера.
На таку схему показано, як WebListener використовує драйвер ядра http.sys в Windows для спільного використання портів:
WebListener в службі без відстеження стану
Для використання WebListener в службі без відстеження стану перевизначите метод CreateServiceInstanceListeners і поверніть екземпляр WebListenerCommunicationListener:
WebListener в службі з відстеженням стану
Налаштування кінцевої точки
Також необхідно передати ім'я кінцевої точки в конструктор WebListenerCommunicationListener.
Використання WebListener зі статичним портом
Щоб використовувати статичний порт з WebListener, вкажіть номер порту в конфігурації Endpoint.
Використання WebListener з динамічним портом
Щоб використовувати динамічно призначається порт з WebListener, опустіть властивість Port в конфігурації Endpoint.
Kestrel в Reliable Services
Kestrel можна використовувати в Reliable Service, імпортувавши пакет NuGet Microsoft.ServiceFabric.AspNetCore.Kestrel. Цей пакет містить KestrelCommunicationListener. реалізацію ICommunicationListener. яка дозволяє створювати WebHost ASP.NET Core всередині Reliable Service за допомогою Kestrel як веб-сервера.
Kestrel - це багатоплатформовий веб-сервер для ASP.NET Core на основі libuv, кроссплатформенной бібліотеки асинхронних операцій введення-виведення. На відміну від WebListener, Kestrel не використовує централізований диспетчер кінцевих точок, такий як http.sys. і не підтримує спільне використання порту між кількома процесами. Кожен екземпляр Kestrel повинен використовувати унікальний порт.
Kestrel в службі без відстеження стану
Для використання Kestrel в службі без відстеження стану перевизначите метод CreateServiceInstanceListeners і поверніть екземпляр KestrelCommunicationListener:
Kestrel в службі з відстеженням стану
Для використання Kestrel в службі з відстеженням стану перевизначите метод CreateServiceReplicaListeners і поверніть екземпляр KestrelCommunicationListener:
У цьому прикладі одноелементний екземпляр IReliableStateManager надається контейнеру впровадження залежностей WebHost. Це не є обов'язковим, але дозволяє використовувати IReliableStateManager і надійні колекції в методах дій контролера MVC.
Зверніть увагу, що ім'я конфігурації Endpoint не надається KestrelCommunicationListener в службі з відстеженням стану. Це пояснюється більш докладно в наступному розділі.
Налаштування кінцевої точки
Для використання Kestrel конфігурація Endpoint не потрібно.
Використання Kestrel і статичного порту
Можна налаштувати статичний порт в конфігурації Endpoint файлу ServiceManifest.xml для використання з Kestrel. Хоча це не є обов'язковим, це дає два потенційних переваги:
Якщо Endpoint налаштована, її ім'я необхідно передати в конструктор KestrelCommunicationListener.
Якщо конфігурація Endpoint не використовується, не вказуйте ім'я кінцевої точки в конструкторі KestrelCommunicationListener. У цьому випадку буде використовуватися динамічний порт. Цей процес описаний в наступному розділі.
Використання Kestrel і динамічного порту
Kestrel не може використовувати автоматичне призначення порту з конфігурації Endpoint в файлі ServiceManifest.xml, так як автоматичне призначення порту з конфігурації Endpoint призначає унікальний порт кожному хост-процесу. В результаті один хост-процес може містити кілька примірників Kestrel. Так як Kestrel не підтримує спільне використання портів, це не буде працювати, тому що кожен екземпляр Kestrel повинен бути відкритий на унікальному порте.
Щоб використовувати динамічне призначення порту в Kestrel, досить повністю опустити конфігурацію Endpoint в файлі ServiceManifest.xml і не передавати ім'я кінцевої точки в конструктор KestrelCommunicationListener.
У цій конфігурації KestrelCommunicationListener автоматично вибере невикористаний порт з діапазону портів додатки.
Сценарії та конфігурації
- Доступна ззовні служба ASP.NET Core без відстеження стану
- Служба ASP.NET Core без відстеження стану тільки для внутрішнього використання
- Служба ASP.NET Core з відстеженням стану тільки для внутрішнього використання
Доступна ззовні служба надає кінцеву точку, доступну за межами кластера, зазвичай через балансувальник навантаження.
Служба тільки для внутрішнього використання - це служба, кінцева точка якої доступна тільки в межах кластера.
Кінцеві точки служби з відстеженням стану не слід робити доступними в Інтернеті. Кластери, що знаходяться за балансувальник навантаження, які не підтримують дозвіл служб Service Fabric (наприклад, Azure Load Balancer), не зможуть надати служби з відстеженням стану, так як балансувальник навантаження не зможе виявляти і направляти трафік в відповідну репліку служби з відстеженням стану.
Доступні ззовні служби ASP.NET Core без відстеження стану
В даний час Kestrel не підтримує як прикордонного сервера (з доступом до Інтернету). Для обробки трафіку з загальнодоступного Інтернету необхідно використовувати зворотний проксі-сервер, наприклад IIS або Nginx.