Устранение неполадок с сертификатами, таких как ненадежный сертификат
в этом разделе содержатся сведения о том, когда сертификат разработки ASP.NET Core HTTPS , но по-прежнему имеются предупреждения браузера о том, что сертификат не является доверенным. сертификат разработки ASP.NET Core HTTPS используется Kestrel .
чтобы восстановить сертификат IIS Express, см. эту проблему Stackoverflow .
Все платформы — сертификат не является доверенным
Выполните следующие команды:
Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения. Доверие сертификатов кэшируется браузерами.
DotNet dev-certs HTTPS—сбой очистки
Предыдущие команды решают большинство проблем с доверием к браузеру. Если браузер по-прежнему не доверяет сертификату, следуйте приведенным ниже рекомендациям для конкретной платформы.
DOCKER — сертификат не является доверенным
- удалите папку C:\Users { USER} \аппдата\роаминг\ ASP.NET \хттпс .
- Очистите решение. Удалите папки bin и obj.
- Перезапустите средство разработки. например, Visual Studio, Visual Studio Code или Visual Studio для Mac.
Windows — сертификат не является доверенным
- Проверьте сертификаты в хранилище сертификатов. Должен быть сертификат с понятным именем в и
- Удалите все найденные сертификаты из личных и доверенных корневых центров сертификации. не удаляйте сертификат IIS Express localhost.
- Выполните следующие команды:
Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.
OS X — сертификат не является доверенным
- Откройте доступ к цепочке ключей.
- Выберите цепочку ключей системы.
- Проверьте наличие сертификата localhost.
- Убедитесь, что он содержит символ на значке, чтобы указать, что он является доверенным для всех пользователей.
- Удалите сертификат из цепочки ключей системы.
- Выполните следующие команды:
Закройте все открытые экземпляры браузера. Откройте новое окно браузера для приложения.
устранение неполадок с сертификатами в Visual Studio см. в разделе об ошибке HTTPS IIS Express (dotnet/AspNetCore #16892) .
Сертификат Linux не является доверенным
Убедитесь, что сертификат, настроенный для доверия, является сертификатом разработчика HTTPS пользователя, который будет использоваться Kestrel сервером.
Проверьте текущий пользователь сертификат разработчика HTTPS по умолчанию по Kestrel следующему адресу:
KestrelФайл сертификата РАЗРАБОТЧИКА HTTPS — это отпечаток SHA1. При удалении файла с помощью он повторно создается при необходимости с другим отпечатком.
Проверьте, совпадают ли отпечатки экспортированного сертификата с помощью следующей команды:
Если сертификат не совпадает, может быть одним из следующих:
- Старый сертификат.
- Экспортированный сертификат разработчика для привилегированного пользователя. В этом случае Экспортируйте сертификат.
Сертификат корневого пользователя можно проверить по адресу:
Устранение неполадок
Сведения об устранении неполадок в приложении службы Windows см. в статье Устранение неполадок и отладка проектов ASP.NET Core.
Распространенные ошибки
- Используется старая или предварительная версия PowerShell.
- Зарегистрированная служба не использует опубликованные выходные данные приложения, возвращенные командой dotnet publish. Выходные данные команды dotnet build не поддерживаются для развертывания приложений. В зависимости от типа развертывания опубликованные ресурсы находятся в одной из следующих папок:
- bin/Release/{TARGET FRAMEWORK}/publish (зависящее от платформы развертывание);
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (автономное развертывание).
- Служба не находится в состоянии выполнения.
- Пути к используемым приложением ресурсам (например, к сертификатам) неверные. Базовый путь к службе Windows — c:\Windows\System32.
- У пользователя отсутствуют права для входа в систему в качестве службы.
- Пароль был указан неверно или его срок действия истек при выполнении команды PowerShell .
- Для приложения требуется выполнить проверку подлинности в ASP.NET Core, однако оно не настроено для безопасных подключений (HTTPS).
- Порт URL-адреса запроса неправильно указан или настроен в приложении.
Журналы событий системы и приложений
Получите доступ к журналам событий системы и приложений:
- Откройте меню «Пуск», выполните поиск по фразе Просмотр событий и выберите приложение Просмотр событий.
- В средстве просмотра событий откройте узел Журналы Windows.
- Выберите Система, чтобы открыть журнал системных событий. Выберите Приложение, чтобы открыть журнал событий приложения.
- Проверьте здесь наличие ошибок, связанных с проблемным приложением.
Запуск приложения в командной строке
Многие ошибки запуска не создают полезные сведения в журналах событий. Для некоторых ошибок можно найти причину, запустив приложение в командной строке на компьютере размещения. Чтобы записать дополнительные сведения из приложения, снизьте или запустите приложение в среде разработки.
Очистка кэшей пакетов
Приложения-функции могут перестать работать сразу после обновления пакета SDK для .NET Core на компьютере разработки или обновления версии пакетов в самом приложении
В некоторых случаях в результате важного обновления несогласованные версии пакетов могут привести к нарушению работы приложения. Большинство этих проблем можно исправить следующим образом:
-
Удалите папки bin и obj.
-
Очистите кэши пакетов, выполнив команду dotnet nuget locals all —clear из командной оболочки.
Очистку кэшей пакетов также можно выполнить с помощью средства nuget.exe или команды . NuGet.exe не входит в пакет установки операционной системы Windows для настольных компьютеров и его нужно получить отдельно на веб-сайте NuGet.
-
Восстановите и перестройте проект.
-
Удалите все файлы из папки развертывания на сервере, прежде чем повторно развернуть приложение.
Медленно работающее или неотвечающее приложение
Аварийный дамп — это моментальный снимок системной памяти, который может помочь определить причину аварийного завершения, сбоя запуска или медленной работы приложения.
Аварийное завершение работы приложения или исключение
Получите и проанализируйте дамп из отчетов об ошибках Windows (WER):
-
Создайте папку для хранения файлов аварийного дампа в .
-
Запустите скрипт PowerShell EnableDumps с именем исполняемого файла приложения:
-
Запустите приложение в условиях, вызывающих аварийное завершение.
-
После аварийного завершения запустите скрипт PowerShell DisableDumps:
Когда приложение аварийно завершит работу и сбор дампов будет выполнен, приложение сможет завершить работу обычным образом. Скрипт PowerShell настраивает отчеты об ошибках Windows для сбора до пяти дампов для приложения.
Предупреждение
Аварийные дампы могут занимать много места на диске (до нескольких гигабайтов каждый).
Приложение не отвечает на запросы, не запускается или работает в обычном режиме
Когда приложение перестает отвечать на запросы (но аварийное завершение не происходит), не запускается или работает в обычном режиме, см. раздел , чтобы выбрать подходящий инструмент для создания дампа.
Анализ дампа
Дамп можно проанализировать несколькими способами. Дополнительные сведения см. в разделе Анализ файла дампа пользовательского режима.
Изучение конечной точки PUT
Этот пример приложения реализует одну конечную точку PUT с помощью :
Этот метод отличается от метода только тем, что использует метод HTTP PUT. Успешный ответ возвращает состояние 204 (без содержимого). Согласно спецификации HTTP, запрос PUT требует, чтобы клиент отправлял всю обновленную сущность, а не только изменения. Чтобы обеспечить поддержку частичных обновлений, используйте HTTP PATCH.
Тестирование конечной точки PUT
В этом примере используется база данных в памяти, которая должна быть инициирована при каждом запуске приложения. При выполнении вызова PUT в базе данных уже должен существовать какой-либо элемент. Для этого перед вызовом PUT выполните вызов GET, чтобы убедиться в наличии такого элемента в базе данных.
Обновите элемент списка дел с идентификатором 1 и присвойте ему имя :
Установка Postman для тестирования приложения
В этом учебнике для тестирования API используется Postman.
- Установка Postman
- Запустите веб-приложение.
- Запустите Postman.
- Отключение параметра Проверка SSL-сертификата
В меню Файл > Параметры (вкладка Общие) отключите параметр Проверка SSL-сертификата.
Предупреждение
После тестирования контроллера снова включите проверку SSL-сертификата.
Проверка публикации данных
Следующие инструкции передают данные в приложение:
-
Создайте новый запрос.
-
Установите HTTP-метод .
-
Задайте для URI значение . Пример:
-
Откройте вкладку Тело.
-
Выберите необработанный.
-
Выберите тип JSON.
-
В теле запроса введите код JSON для элемента списка дел:
-
Нажмите кнопку Отправить.
Роутинг на основе атрибутов на уровне контроллера:
В приложении ASP.NET Core MVC также возможно применить атрибут к классу , а также к отдельным методам действий. Если вы хотите сделать атрибут маршрутизации менее повторяющимся, то вам нужно использовать атрибуты маршрута на уровне контроллера, а также на уровне отдельных методов действий. Чтобы в этом убедиться отредактируем класс , как показано ниже.
С помощью приведенного выше кода мы можем получить доступ к методу действия , используя следующие 3 URL-адреса.
В той же строке мы также можем получить доступ к методу действия , используя следующие 2 URL.
Если вы заметили, мы используем слово Home несколько раз (в нашем примере четыре раза). Чтобы не дублировать эти маршруты, нам нужно применить атрибут со словом на уровне класса , как показано ниже.
Примечание. Шаблон маршрута, применяемый на уровне контроллера, добавляется к шаблону маршрута, применяемому к уровню метода действия.
Теперь, при переходе по следующим четырем URL-адресам, вы получите ожидаемый результат.
Однако при переходе к корневому URL-адресу приложения вы получите ошибку 404. Чтобы решить эту проблему, необходимо включить шаблон маршрута, который начинается с , в метод действия , как показано ниже.
После внесения вышеуказанных изменений запустите приложение и перейдите по корневому URL-адресу, чтобы увидеть ожидаемый результат.
использованиеIStartupFilterЧтобы запустить задачу синхронизации
В предыдущем блоге я представилЭто мощный интерфейс для пользовательских приложений ASP.NET Core.
Если вы новичок в Filter, я предлагаю вам перейти на мой предыдущий блог, здесь я приведу только краткое резюме.
Будет выполняться в процессе настройки конвейера промежуточного программного обеспечения (обычно вЗавершена). Они позволяют настраивать конвейер промежуточного программного обеспечения, фактически созданного приложением, путем добавления дополнительного промежуточного программного обеспечения, разветвления или выполнения любых других операций. Например, следующий код показывает
Это очень полезно, но какое отношение это имеет к выполнению одноразовой задачи при запуске приложения ASP.NET Core?
Основная функция состоит в том, чтобы предоставить разработчикам ловушку, время этой ловушки запускается после того, как конфигурация приложения завершена, и контейнер внедрения зависимости настроен, прежде чем приложение запускается. Это означает, что вы можете достичьВнедрение зависимостей используется в классе, поэтому вы можете выполнять здесь много задач, которые вы хотите запустить до того, как приложение будет включено. Построен с ASP.NET CoreDataProtectionStartupFilterНапример, он инициализирует весь модуль защиты данных перед запуском программы.
Еще одна важная функция заключается в том, что она позволяет добавлять задачи, выполняемые при регистрации служб, в контейнер внедрения зависимостей. Это означает, что если вы пишете библиотеку самостоятельно, вы можете зарегистрировать задачу при запуске приложения, не требуя, чтобы приложение явно вызывало ее.
ВопросЭто в основном синхронизировано.Возвращаемое значение метода неТаким образом, мы можем использовать только асинхронные методы для выполнения асинхронных задач, что, очевидно, не является хорошим планом реализации. Я буду обсуждать это позже, но теперь давайте сначала пропустим это.
Создание файла подразделения службы для второго приложения
В файле подразделения службы используется следующее определение службы. Помните, что второе приложение будет работать в каталоге /var/buggyamb_v1.1.
Примечание
Строка объявит переменную среды с именем и скажет нашему приложению прослушивать в порту 5001:
Имя файла службы будет buggyamb.service и будет создано в каталоге /etc/systemd/system/. Как и прежде, используйте редактор vi и запустите команду для создания файла определения службы. Скопируйте и вклеите эту конфигурацию и сохраните ее
Еще раз обратите внимание на то, как вы установите переменную среды:
Теперь вы настроили ASP.NET Core веб-приложение для запуска в качестве daemon. Достаточно ли этого для того, чтобы выполнить цель, о которую мы заявляли в начале обучения? Включить и запустить службу, запуская команды и команды. Затем проверьте состояние службы с помощью запуска, как показано на следующем скриншоте.
Теперь вы можете проверить, работает ли приложение BuggyAmb так, как ожидалось. Запустите команду, чтобы на консоли отображалась страница Welcome HTML BuggyAmb, как показано на следующем скриншоте.
Приложение еще не может быть протестировано от клиента, так как оно прослушивается в порту 5001. Этот порт не разрешен в параметрах брандмауэра. Так как Nginx не предоставляет порту доступ к Интернету, вы можете настроить Nginx для прослушивания в порту 80 и переназначить трафик в BuggyAmb, когда входящие http-запросы будут сделаны с помощью определенного имени хост-сайта. Например, можно использовать имена хостов: или . Вы также можете использовать любое другое имя хост-кодов, которое вам нужно.
На данный момент цель состоит в том, чтобы второе ASP.NET Core приложение было запущено бок о бок с первым демо-приложением. В следующей главе мы продолжим настраивать Nginx, описывая его в этой части.
Почему бы не использовать проверку здоровья?
В ASP.NET Core 2.2 была добавлена новая функция проверки работоспособности, которая предоставляет узел HTTP, позволяющий запрашивать состояние работоспособности текущего приложения. После развертывания приложения механизм оркестровки, такой как Kubernetes или обратный прокси-сервер, такой как HAProxy и NGINX, может запросить этот узел HTTP, чтобы проверить, готово ли ваше приложение начать получать запросы.
Вы можете использовать функцию проверки работоспособности, чтобы убедиться, что ваше приложение не запускает обработку запросов, пока не будут выполнены все необходимые одноразовые задачи инициализации. Однако это имеет ряд недостатков:
-
WebHost и Kestrel сами запустятся перед выполнением одноразовой задачи инициализации, хотя они не будут получать «реальные» запросы (только запросы проверки работоспособности), которые могут быть проблематичными.
-
Этот подход вносит дополнительную сложность.В дополнение к добавлению кода для запуска одноразовой задачи, вам также необходимо добавить проверку работоспособности, чтобы проверить, завершена ли задача, и синхронизировать ее состояние.
-
При запуске приложения возникает задержка, так как необходимо дождаться завершения всех задач, поэтому вряд ли сократится время запуска.
-
Если задача не выполнена, приложение не завершит работу и проверка работоспособности никогда не пройдет. Это может быть приемлемо, но я лично предпочитаю, чтобы приложение немедленно закрывалось.
-
Используя проверку работоспособности, вы не можете знать, как выполняется одноразовая задача, вы можете только знать, завершена ли задача.
На мой взгляд, проверка работоспособности не подходит для сценария с одноразовым заданием, но может быть полезна для некоторых из описанных мной примеров, но я не думаю, что она применима ко всем ситуациям. Я очень надеюсь быть вПеред началом выполните несколько разовых задач.
Создание проекта веб-API
Анализ кода
Файл Program.cs содержит следующий код:
Шаблон проекта создает API с поддержкой Swagger. Swagger используется для создания полезной документации и страниц справки для веб-API.
Выделенный ниже код добавляет поддержку для Swagger:
Запуск приложения
Откроется страница Swagger . Выберите Get (Получить) > Try it out (Попробовать) > Execute (Выполнить). На странице отобразятся:
- команда Curl для тестирования API WeatherForecast;
- URL-адрес для тестирования API WeatherForecast;
- код, текст и заголовки ответа;
- раскрывающийся список с типами мультимедиа и примером значения и схемы.
Скопируйте и вставьте URL-адрес запроса в адресную строку браузера: . Возвращаемые данные JSON будут выглядеть примерно так:
Публикация на IIS
Последнее обновление: 26.03.2018
После завершения работы над приложением приложение его можно опубликовать, чтобы оно стало доступно широкому кругу пользователей.
Как правило, для хостирования приложения будет применяться один из внешних хостингов, список которых можно посмотреть здесь.
В данном же случае рассмотрим основные моменты публикации и развертывания приложения на локальном компьютере.
Традиционно веб-сервер IIS (Internet Information Services) применялся для развертывания веб-приложений. Для хостирования веб-приложений ASP.NET Core
также может применяться IIS, только в отличие от предыдущих версий ASP.NET теперь его роль будет сводиться к прокси-серверу.
Хостирование приложений ASP.NET Core на IIS происходит с помощью нативного модуля AspNetCoreModule, который сконфигурирован таким
образом, чтобы перенаправлять запросы на веб-сервер Kestrel. Этот модуль управляет запуском внешнего процесса dotnet.exe, в рамках которого хостируется
приложение, и перенаправляет все запросы от IIS к этому хостирующему процессу.
При разработке в Visual Studio публиковать приложения очень легко — среда разработки имеет для этого весь необходимый инструментарий.
Так, возьмем какой-нибудь проект и в Visual Studio нажмем на него правой кнопкой мыши и в появившемся контекстном меню выберем пункт Publish:
И перед нами откроется окно публикации приложения:
Здесь нам доступно несколько вариантов публикации:
-
Microsoft Azure App Service: публикация в облаке Azure
-
IIS, FTP, etc: публикация через FTP
-
Folder: публикация в виде отдельного пакета в файловой системе текущей рабочей машины
-
Import Profile: импорт профиля, который содержит настройки публикации
-
Microsoft Azure Virtual Machines: публикация в облаке Azure, по сравнению с первой опцией обладает большими возможностями по управлению инфраструктурой развертывания
В данном случае выберем опцию Folder для создания пакета для публикации в файловой системе. И также укажем путь, по которому будет находиться
пакет. В моем случае это каталог «C:\CoreApp». И в конце нажмем на кнопку Publish.
Далее откроется окно, где будут оображаться выбранные настройки конфигурации, и для продолжения публикации нажмем в нем кнопку Publish:
И после окончания публикации по указанному пути (в моем случае это каталог C:\CoreApp) появятся опубликованные файлы.
Настройка IIS
Прежде всего нам надо включить функциональность Web Server (IIS) и настроить роли сервера. Для этого перейдем по пути Панель управления ->
Программы и компоненты -> Включение или отключение компонентов Windows. В списке компонентов найдем Службы IIS (Internet Information Services) и отметим ее:
Здесь также надо отметить подпункт «Службы Интернета» (World Wide Web Services) и все его подпункты, а также подпункт «Консоль управления IIS»
(IIS Management Console).
Нажмем на ОК, и весь необходимый функционал будет добавлен в операционную систему.
После установки этого пакета выполним в командной строке команду iisreset или вручную перезапустим IIS, чтобы сервер применил изменения.
Конфигурация сервера
Для конфигурации IIS перейдем к консоли управления веб-сервером. Для этого перейдем по пути
Панель управления -> Администрирование -> Диспетчер служб IIS:
Нажмем правой кнопкой на узел «сайты» и в контекстном меню выберем пункт «Добавить веб-сайт…». После этого нам откроется окно для добавления нового сайта:
В поле «Физический путь» здесь укажем каталог, в котором опубликовано приложение. А в качестве имени узла определим «localhost». Нажмем на OK, и приложение будет запущено.
Теперь перейдем к пункту Пулы приложений. Выберем пул нашего приложения и справа нажмем на ссылку Основные настройки:
В открывшемся окне для параметра Версия среды CLR .NET установим значение Без управляемого кода:
После этого пул будет перезапущен, и мы сможем обращаться к нашему приложению по адресу localhost.
НазадВперед
Установка приложения в виде службы Windows
Последнее обновление: 12.06.2018
ASP.NET Core можно развертывать в виде обычной службы Windows без каких-либо веб-серверов, в частности, IIS.
Создадим новый проект ASP.NET Core 2.1 любого типа. Прежде всего, нам надо добавить в проект через Nuget пакет
Microsoft.AspNetCore.Hosting.WindowsServices.
После создания проекта обратимся к файлу Program.cs, который во всех проектах выглядит идентично:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace ServiceHostingApp { public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); } }
Изменим его следующим образом:
using System.Diagnostics; using System.IO; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting.WindowsServices; namespace ServiceHostingApp { public class Program { public static void Main(string[] args) { // получаем путь к файлу var pathToExe = Process.GetCurrentProcess().MainModule.FileName; // путь к каталогу проекта var pathToContentRoot = Path.GetDirectoryName(pathToExe); // создаем хост var host = WebHost.CreateDefaultBuilder(args) .UseContentRoot(pathToContentRoot) .UseStartup<Startup>() .Build(); // запускаем в виде службы host.RunAsService(); } } }
Чтобы запустить приложение в виде службы у объекта IWebHost вызывается метод RunAsService().
Публикация
Теперь нам надо опубликовать приложение в файловой системе. Мы можем это сделать через консоль с помощью команды .
Для этого вначале в командной строке/терминале надо перейти к папке проекта и из нее запустить команду:
dotnet publish --configuration Release --runtime win10-x64 --output c:\myapp
Поскольку приложение будет устанавливаться в виде службы Windows и должно иметь исполняемый файл, то указывается
параметр . В данном случае служба будет устанавливаться на Windows 10 с 64-битной архитектурой. Поэтому
для этого параметра указано значение .
Параметр указывает, где будет опубликовано приложение — то есть в данном случае в папке c:\myapp.
Также можно поизвести публикацию с помощью графических средств в Visual Studio.
Создание службы
После публикации с помощью консольной утилиты sc.exe создадим службу:
sc create НАЗВАНИЕ_СЛУЖБЫ binPath= "ПУТЬ К ИСПОЛНЯЕМОМУ ФАЙЛУ EXE"
После команды указывается имя службы. Службу можно назвать как угодно.
Параметр указывает на путь к исполняемому файлу (в том числе имя самого файла).
Причем между знаком равно и путем к файлу в кавычках должен идти пробел.
Например, ранее приложение было опубликовано в папке c:\myapp. Как правило, название исполняемого файла соответствует названию проекта, то есть в моем случае
в папке c:\myapp после публикации находится исполняемый файл . И, допустим, служба буде называться
MyAspService. В этом случае команда на создание службы будет выглядеть следующим образом:
sc create MyAspService binPath= "c:\myapp\servicehostingapp.exe"
Запуск службы
После установки службы запустим ее с помощью команды:
sc start MyAspService
Команде передается имя ранее установленной службы — в моем случае это MyAspService.
После установки мы можем обратиться обратиться к нашему веб-приложению из браузера по адресу http://localhost:5000:
НазадВперед
Запуск приложения. Класс Program
Последнее обновление: 29.10.2019
В любом типе проектов ASP.NET Core, как и в проекте консольного приложения, мы можем найти файл Program.cs, в котором определен одноименный класс Program
и с которого по сути начинается выполнение приложения. В ASP.NET Core 3 этот файл выглядит следующим образом:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace HelloApp { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } }
Чтобы запустить приложение ASP.NET Core, необходим объект IHost, в рамках которого развертывается веб-приложение. Для
создания IHost применяется объект IHostBuilder.
В программе по умолчанию в статическом методе как раз создается и настраивается IHostBuilder.
Непосредственно создание IHostBuilder производится с помощью метода Host.CreateDefaultBuilder(args).
Данный метод выполняет ряд задач.
-
Устанавливает корневой каталог (для этого используется свойство Directory.GetCurrentDirectory). Корневой каталог представляет папку, где будет
производиться поиск различного содержимого, например, представлений. -
Устанавливает конфигурацию хоста. Для этого загружаются переменные среды с префиксом «DOTNET_» и аргументы командной строки
-
Устанавливает конфигурацию приложения. Для этого загружается содержимое из файлов appsettings.json и appsettings.{Environment}.json, а также
переменные среды и аргументы командной строки. Если приложение в статусе разработки, то также используются данные Secret Manager (менеджера секретов), который
позволяет сохранить конфиденциальные данные, используемые при разработке. -
Добавляет провайдеры логирования
-
Если проект в статусе разработки, то также обеспечивает валидацию сервисов
Далее вызывается метод ConfigureWebHostDefaults(). Этот метод призван выполнять конфигурацию параметров хоста, а именно:
-
Загружает конфигурацию из переменных среды с префиксом «ASPNETCORE_»
-
Запускает и настраивает веб-сервер Kestrel, в рамках которого будет разворачиваться приложение
-
Добавляет компонент , который позволяет настраивать адреса для веб-сервера Kestrel
-
Если переменная окружения равна , добавляет компонент Forwarded Headers, который позволяет считывать из запроса заголовки «X-Forwarded-«
-
Если для работы приложения требуется IIS, то данный метод также обеспечивает интеграцию с IIS
Метод в качестве параметра принимает делегат .
А помощью последовательного вызова цепочки методов у объекта IWebHostBuilder производится инициализация веб-сервера для развертывания
веб-приложения. В частности, в данном случае у IWebHostBuilder вызывается метод UseStartup():
webBuilder.UseStartup<Startup>()
Этим вызовом устанавливается стартовый класс приложения — класс Startup, с которого и будет начинаться обработка входящих запросов.
В методе Main вызывается метод у созданного объекта IHostBuilder вызывается метод Build(), который собственно создает хост — объект IHost, в рамках которого
развертывается веб-приложение. А затем для непосредственного запуска у IHost вызывается метод Run:
CreateHostBuilder(args).Build().Run();
После этого приложение запущено, и веб-сервер начинает прослушивать все входящие HTTP-запросы.
НазадВперед
Загрузка файлов на сервер
Последнее обновление: 13.12.2021
Рассмотрим, как загружать файлы на сервер в ASP.NET Core. Все загружаемые файлы в ASP.NET Core представлены типом IFormFile из пространства имен .
Соответственно для получения отправленного файла в контроллере необходимо использовать IFormFile. Затем с помощью методов IFormFile мы можем произвести различные манипуляции
файлом — получит его свойства, сохранить, получить его поток и т.д. Некоторые его свойства и методы:
-
: тип файла
-
: название файла
-
: размер файла
-
: копирует файл в поток
-
: открывает поток файла для чтения
Для тестирования данной возможности определим в проекте папку html, в которой создадим файл index.html
Определим в файле index.html следующий код:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>METANIT.COM</title> </head> <body> <h2>Выберите файл для загрузки</h2> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="uploads" /><br> <input type="file" name="uploads" /><br> <input type="file" name="uploads" /><br> <input type="submit" value="Загрузить" /> </form> </body> </html>
В данном случае форма содержит набор элементов с типом file, через которые можно выбрать файлы для загрузки. В данном случае на форме три таких элемента,
но их может быть и меньше и больше. А благодаря установке атрибута формы enctype=»multipart/form-data» браузер будет знать, что вместе с формой надо передать файлы.
Отправляться файлы будут в запросе типа POST на адрес «/upload».
Теперь в файле Program.cs определим код, который будет получать загружаемые файлы:
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.Run(async (context) => { var response = context.Response; var request = context.Request; response.ContentType = "text/html; charset=utf-8"; if (request.Path == "/upload" && request.Method=="POST") { IFormFileCollection files = request.Form.Files; // путь к папке, где будут храниться файлы var uploadPath = $"{Directory.GetCurrentDirectory()}/uploads"; // если такой папки нет, то создаем ее if(!Directory.Exists(uploadPath)) Directory.CreateDirectory(uploadPath); foreach (var file in files) { // путь к папке uploads string fullPath = $"{uploadPath}/{file.FileName}"; // сохраняем файл в папку uploads using (var fileStream = new FileStream(fullPath, FileMode.Create)) { await file.CopyToAsync(fileStream); } } await response.WriteAsync("Файлы успешно загружены"); } else { await response.SendFileAsync("html/index.html"); } }); app.Run();
Здесь если запрос приходит по адресу «/upload», а сам запрос представляет запрос типа POST, то приложение получает коллекцию загруженных файлов с помощью
свойства Request.Form.Files, которое представляет тип IFormFileCollection:
IFormFileCollection files = request.Form.Files;
Далее определяем каталог для загружаемых файлов (предполагается, что файлы будут храниться в каталоге «uploads», которая располагается в папке приложения)
var uploadPath = $"{Directory.GetCurrentDirectory()}/uploads";
Если такой папки нет, то создаем ее. Затем перебираем всю коллекцию файлов.
foreach (var file in files)
Каждый отдельный файл в этой коллекции представляет тип IFormFile. Для копирования файла
в нужный каталог создается поток FileStream, в который записывается файл с помощью метода .
using (var fileStream = new FileStream(fullPath, FileMode.Create)) { await file.CopyToAsync(fileStream); }
Если запрос идет по другому адресу и/или не представляет тип POST, то отправляем клиенту html-страницу index.html.
Обратимся к приложению и выберем файлы для загрузки:
И после успешной загрузки нам отобразиться соответствующее сообщение:
А в каталоге проекта будет создана папка uploads, в которой появятся загуженные файлы:
НазадВперед
Возвращаемые значения
ASP.NET Core автоматически сериализует объект в формат JSON и записывает данные JSON в тело сообщения ответа. Код ответа для этого типа возвращаемого значения равен 200 OK, что свидетельствует об отсутствии необработанных исключений. Необработанные исключения преобразуются в ошибки 5xx.
Типы возвращаемых значений могут представлять широкий спектр кодов состояний HTTP. Например, метод может возвращать два разных значения состояния:
- Если запрошенному идентификатору не соответствует ни один элемент, метод возвращает код ошибки 404 NotFound.
- В противном случае метод возвращает код 200 с телом ответа JSON. При возвращении возвращается ответ HTTP 200.
Преимущества, обеспечиваемые ASP.NET Core
Миллионы разработчиков использовали и продолжают использовать ASP.NET 4.x для создания веб-приложений. ASP.NET Core — это модификация ASP.NET 4.x с архитектурными изменениями, формирующими более рациональную и более модульную платформу.
ASP.NET Core предоставляет следующие преимущества:
- Единое решение для создания пользовательского веб-интерфейса и веб-API.
- Разработано для тестируемости.
- Razor Pages упрощает написание кода для сценариев страниц и повышает его эффективность.
- Blazor позволяет использовать в браузере язык C# вместе с JavaScript. совместное использование серверной и клиентской логик приложений, написанных с помощью .NET;
- Возможность разработки и запуска в ОС Windows, macOS и Linux.
- Открытый исходный код и ориентация на сообщество.
- Интеграция современных клиентских платформ и рабочих процессов разработки.
- Поддержка размещения служб удаленного вызова процедур (RPC) с помощью gRPC.
- Облачная система конфигурации на основе среды.
- Встроенное введение зависимостей.
- Упрощенный высокопроизводительный модульный конвейер HTTP-запросов.
- Следующие возможности размещения:
- Kestrel
- Службы IIS
- HTTP.sys
- Nginx
- Apache
- Docker
- .
- Инструментарий, упрощающий процесс современной веб-разработки.