Приложение с S3, PostgreSQL и ASP.NET Core Web API
Приложение с S3, PostgreSQL и ASP.NET Core Web API
Облачные технологии и микросервисная архитектура
Современная разработка программного обеспечения опирается на принципы облачных вычислений. Облачные технологии предоставляют возможность доступа к вычислительным ресурсам, хранилищам данных и сервисам через интернет по запросу. Организация инфраструктуры в облаке позволяет масштабировать приложения, повышать их отказоустойчивость и снижать затраты на содержание собственного оборудования. В контексте веб-разработки облако выступает как платформа для размещения серверной части приложений, баз данных и систем хранения файлов.
Микросервисная архитектура представляет собой подход к проектированию программных систем, при котором приложение разделяется на набор небольших независимых сервисов.
Каждый сервис выполняет отдельную бизнес-задачу, работает автономно и взаимодействует с другими компонентами системы через легкие механизмы коммуникации, чаще всего используя REST API или асинхронные сообщения. Такой подход обеспечивает гибкость разработки, возможность независимо обновлять отдельные части системы, упрощает тестирование и позволяет использовать разные технологии для реализации разных сервисов. В рамках микросервисного подхода каждый компонент может быть развернут, масштабирован и поддерживается отдельно от других частей системы.
Паттерны проектирования играют ключевую роль в создании надежных и поддерживаемых систем. Паттерн — это проверенное временем решение типовой проблемы проектирования. Использование паттернов позволяет разработчикам не изобретать велосипед заново, а применять готовые архитектурные решения, которые уже доказали свою эффективность. В данном проекте мы применяем паттерн разделения ответственности между слоями приложения:
- слой представления (контроллеры),
- слой логики (сервисы);
- слой доступа к данным (репозитории).
Также используется паттерн конфигурации, который позволяет выносить настройки во внешние файлы, обеспечивая гибкость изменения параметров без перекомпиляции кода.
В этом разделе мы рассмотрим создание сервиса управления медиафайлами. Этот сервис обеспечивает загрузку файлов в объектное хранилище, хранение метаданных о файлах в реляционной базе данных и предоставляет REST API для взаимодействия с данными. Сервис принимает файл от клиента, сохраняет его содержимое в объектном хранилище, записывает информацию о файле (имя, размер, тип, дату создания) в базу данных и возвращает клиенту подтверждение успешной загрузки. Такой подход позволяет разделить хранение больших бинарных данных (сам файл) и структурированной информации (метаданные), что повышает производительность и масштабируемость системы. Объектное хранилище отлично подходит для хранения файлов, так как оно способно работать с огромными объемами неструктурированных данных, в то время как реляционная база данных эффективно управляет связями и поиском по метаданным.
Объектное хранилище S3 и библиотеки Amazon S3
Объектное хранилище S3 (Simple Storage Service) — это служба хранения объектов, разработанная компанией Amazon Web Services. Служба позволяет хранить и получать любые объемы данных практически неограниченное количество времени.
Данные в S3 хранятся в виде объектов, каждый из которых состоит из:
- самого файла,
- уникального идентификатора (ключа);
- набора метаданных.
Объекты группируются в бакеты (buckets), которые представляют собой контейнеры верхнего уровня. Бакет имеет глобально уникальное имя и служит для логической организации данных.
Библиотека Amazon S3 SDK — это набор классов и методов, предоставляемый Amazon для работы с облачным хранилищем S3 из приложений, написанных на различных языках программирования. Библиотека абстрагирует сложные детали сетевого взаимодействия, аутентификации и шифрования, предоставляя простой интерфейс для выполнения операций с объектами: загрузка, скачивание, удаление, получение списка объектов.
Подключение библиотеки к проекту осуществляется через систему управления пакетами. В среде .NET это делается через NuGet Package Manager или командную строку. Установка пакета добавляет необходимые DLL-файлы в проект, что позволяет использовать классы Amazon.S3 и связанные с ними методы.
Для локальной разработки и тестирования использование реального облачного хранилища Amazon S3 может быть неудобным по нескольким причинам:
- Требуется регистрация аккаунта и настройка прав доступа.
- Работа с реальным облаком связана с затратами, даже если тарифный план включает бесплатный уровень.
- Скорость работы с удаленным сервером зависит от качества интернет-соединения. Для этих целей лучше использовать эмулятор MinIO.
MinIO — это высокопроизводительное объектное хранилище, совместимое с API Amazon S3. Оно работает локально, не требует подключения к интернету и полностью бесплатное. Эмулятор имитирует поведение реального S3, позволяя разработчикам тестировать код в условиях, максимально приближенных к продакшену, но без затрат и ограничений внешнего сервиса.
MinIO отличается от Amazon S3 тем, что это самостоятельная система хранения, развертываемая на собственном оборудовании или в виртуальной машине, тогда как Amazon S3 — это управляемый сервис в облаке AWS. MinIO предоставляет те же основные операции с объектами, поддерживает ту же структуру API, что делает миграцию с MinIO на Amazon S3 или наоборот минимально трудоемкой. Установка реальной S3 в производственной среде обычно означает аренду соответствующего сервиса у провайдера AWS. Это не требует установки программного обеспечения на свои серверы, так как вся инфраструктура находится под управлением Amazon. Пользователь получает доступ к сервису через API, используя свои учетные данные (Access Key и Secret Key), полученные после регистрации.
Сервис управления медиафайлами
Сервис управления медиафайлами — это специализированное программное обеспечение, предназначенное для обработки, хранения и предоставления доступа к мультимедийным контентам. Такой сервис обеспечивает загрузку файлов в объектное хранилище, где они сохраняются как объекты с уникальными именами. Одновременно с этим сервис хранит метаданные о каждом файле в реляционной базе данных.
Метаданные включают информацию об имени файла, размере, типе контента (MIME-тип), дате создания и другие атрибуты.
Предоставление REST API позволяет другим приложениям взаимодействовать с этим сервисом, отправляя запросы на загрузку, получение списка файлов, удаление файлов и другие операции.
Хранение самих файлов в базе данных нецелесообразно, так как базы данных оптимизированы для работы со структурированными данными, а не с большими бинарными блоками. Разделение хранения файла и метаданных позволяет использовать преимущества обоих типов хранилищ: высокая скорость поиска и фильтрации по метаданным в реляционной базе и надежное хранение больших объемов данных в объектном хранилище. Сервис также обеспечивает безопасность данных, контролируя права доступа к файлам, и может предоставлять функции кэширования, сжатия и конвертации изображений или видео.
Стек технологий проекта
Проект использует современный стек технологий, обеспечивающий высокую производительность, надежность и удобство разработки.
- ASP.NET Core Web API — это фреймворк для создания RESTful API и веб-сервисов. Версия .NET 10 предлагает последние улучшения в производительности, безопасности и поддержке новых стандартов. Фреймворк работает кроссплатформенно, поддерживает асинхронное программирование и предоставляет встроенные механизмы для встраивания документации и тестирования.
- MinIO — это эмулятор Amazon S3, используемый для локального развития. Он запускается в контейнере Docker, что упрощает развертывание и изоляцию среды. MinIO обеспечивает полную совместимость с API S3, позволяя использовать стандартные библиотеки для работы с облачным хранилищем.
- PostgreSQL — это мощная реляционная система управления базами данных с открытым исходным кодом. Она поддерживает сложные запросы, транзакции, индексы и расширения. PostgreSQL идеально подходит для хранения метаданных благодаря своей надежности и способности обрабатывать большие объемы структурированных данных.
- Entity Framework Core — это объектно-реляционный маппер (ORM), который позволяет работать с базой данных как с коллекциями объектов на языке C#. Подход Code First означает, что модель данных определяется в коде, а затем на основе этой модели автоматически создаются таблицы базы данных. Это ускоряет процесс разработки и упрощает изменение структуры данных.
- Библиотека Minio.Client — это нативная библиотека для работы с MinIO, аналогичная AWS SDK для S3. Она предоставляет методы для выполнения всех основных операций с объектами: создание бакета, загрузка файла, получение ссылки на скачивание, удаление объекта. Библиотека оптимизирована для высокой производительности и безопасного взаимодействия с хранилищем.
- Swagger / OpenAPI (Swashbuckle.AspNetCore) — это инструмент для автоматической генерации интерактивной документации API. Swagger UI позволяет разработчикам и пользователям видеть все доступные эндпоинты, параметры запросов и примеры ответов прямо в браузере, что упрощает интеграцию с другими системами.
- Docker — это платформа для контейнеризации приложений. Контейнер — это легковесная, переносимая единица программного обеспечения, которая содержит всё необходимое для запуска приложения: код, среду выполнения, библиотеки и настройки. Использование Docker позволяет легко развернуть MinIO и другие зависимости в изолированной среде, исключая конфликты версий и проблем с окружением.
Установка и настройка среды разработки
Установка Visual Studio и .NET 10
Первым шагом является установка интегрированной среды разработки Visual Studio.
Рекомендуется использовать последнюю версию Visual Studio 2022 Community или Professional.
При установке необходимо выбрать рабочую нагрузку «Разработка веб-приложений» (.NET Desktop Development не требуется для этого проекта).
После завершения установки необходимо убедиться, что установлен пакет .NET 10 SDK. Это можно проверить, открыв терминал и выполнив команду dotnet --version. Если версия ниже 10, необходимо скачать и установить SDK с официального сайта Microsoft.
Установка пакетов NuGet
После создания проекта необходимо добавить необходимые пакеты. В среде Visual Studio это делается через менеджер пакетов.
Откройте окно Управление пакетами NuGet (меню Проект -> Управление пакетами NuGet) и установите следующие пакеты:
| Пакет | Назначение |
|---|---|
Microsoft.EntityFrameworkCore.Design | Инструментарий для создания миграций БД |
Microsoft.EntityFrameworkCore.Tools | Команды Package Manager Console (Add-Migration, Update-Database) |
Npgsql.EntityFrameworkCore.PostgreSQL | Provider для подключения к PostgreSQL |
Minio | Клиент для работы с MinIO (замена AWS SDK) |
Swashbuckle.AspNetCore | Генерация документации Swagger UI |
Эти пакеты обеспечивают функциональность работы с базой данных, подключение к PostgreSQL, взаимодействие с объектным хранилищем и генерацию документации API.
Установка и запуск Docker Desktop
Необходимо установить Docker Desktop для вашей операционной системы. После установки запустите приложение и дождитесь полной инициализации Docker Engine.
Убедитесь, что Docker работает корректно, выполнив команду docker --version в терминале.
Запуск MinIO осуществляется через команду Docker. Откройте терминал в папке проекта и выполните следующую команду в одну строку:
docker run -p 9000:9000 -p 9001:9001 --name s3-local -e "MINIO_ROOT_USER=minioadmin" -e "MINIO_ROOT_PASSWORD=minioadmin" -v minio-data:/data minio/minio server /data --console-address ":9001"
Эта команда создает и запускает контейнер с именем s3-local.
Порт 9000 используется для API интерфейса, через который ваше приложение будет общаться с хранилищем.
Порт 9001 выделяется для веб-консоли администратора, где можно управлять бакетами и пользователями.
Имя пользователя по умолчанию — minioadmin, пароль — minioadmin.
Данные будут сохраняться в томе minio-data, что гарантирует их сохранение при перезапуске контейнера.
Установка PostgreSQL и pgAdmin
Необходимо установить СУБД PostgreSQL. Скачайте установщик с официального сайта PostgreSQL и выполните установку, приняв настройки по умолчанию или указав свой пароль суперпользователя.
Рекомендуется также установить pgAdmin — графический интерфейс для управления базами данных.
Запустите pgAdmin, создайте новое соединение с сервером PostgreSQL, используя имя хоста localhost, порт 5432, пользователя postgres и указанный вами пароль.
Внутри pgAdmin создайте новую базу данных с именем s3_media_db.
Также убедитесь, что пользователь postgres имеет соответствующие права на создание таблиц и выполнение операций с этой базой. Пароль пользователя можно изменить в свойствах соединения или через SQL-запрос, если требуется более сложная конфигурация безопасности.
Создание бакета в MinIO
Откройте браузер и перейдите по адресу http://localhost:9001.
Введите имя пользователя minioadmin и пароль minioadmin.
После входа в систему нажмите кнопку «Create Bucket». Введите имя нового бакета s3-media-manager-files.
Бакет — это контейнер верхнего уровня в объектном хранилище, аналогичный корневой директории в файловой системе. Все файлы, загружаемые в систему, будут находиться внутри этого бакета. Бакет должен иметь уникальное имя в пределах пространства имен конкретного экземпляра MinIO.
После создания бакета он появится в списке доступных контейнеров.
Создание проекта и структура кода
Создание проекта ASP.NET Core Web API
Откройте Visual Studio и выберите «Создание нового проекта».
Найдите шаблон «ASP.NET Core Web API». Выберите версию .NET 10.
Введите имя проекта S3MediaManager. Укажите путь к папке, созданной ранее.
Нажмите «Создать». Visual Studio создаст структуру проекта с базовыми файлами и конфигурацией.
Файл Program.cs
Файл Program.cs является точкой входа в приложение и местом регистрации всех сервисов и компонентов.
using Microsoft.EntityFrameworkCore;
using Npgsql;
using S3MediaManager.Models;
using Swashbuckle.AspNetCore;
using Minio;
using Minio.DataModel.Args;
var builder = WebApplication.CreateBuilder(args);
// 1. Регистрация базы данных (PostgreSQL)
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
// 2. Регистрация настроек S3
builder.Services.Configure<S3Settings>(builder.Configuration.GetSection("S3"));
// 3. Регистрация клиента MinIO
builder.Services.AddSingleton<IMinioClient>(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
var endpoint = config["S3:Endpoint"]?.Replace("http://", "").Replace("https://", "") ?? "localhost:9000";
var accessKey = config["S3:AccessKey"] ?? "minioadmin";
var secretKey = config["S3:SecretKey"] ?? "minioadmin";
return new MinioClient()
.WithEndpoint(endpoint)
.WithCredentials(accessKey, secretKey)
.Build();
});
// 4. Регистрация контроллеров
builder.Services.AddControllers();
// 5. Настройка Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
namespace S3MediaManager.Models
{
public class S3Settings
{
public string Endpoint { get; set; } = "";
public string Region { get; set; } = "";
public string BucketName { get; set; } = "";
public bool UseSSL { get; set; }
public string AccessKey { get; set; } = "";
public string SecretKey { get; set; } = "";
}
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
public DbSet<FileMetadata> Files { get; set; }
}
public class FileMetadata
{
public int Id { get; set; }
public string OriginalName { get; set; } = "";
public string S3Key { get; set; } = "";
public long Size { get; set; }
public string ContentType { get; set; } = "";
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
}
Разбор кода Program.cs
WebApplication.CreateBuilder(args)— статический метод, создающий экземпляр конструктора приложения. Он инициализирует сборку зависимостей, конфигурацию и среду выполнения. Переменнаяbuilderсодержит все настройки, которые будут использованы при запуске приложения.builder.Services— коллекция сервисов, которые регистрируются в контейнере внедрения зависимостей (Dependency Injection Container). DI позволяет создавать объекты и передавать их в нужные места без жесткого связывания кода.AddDbContext<ApplicationDbContext>— метод расширения для регистрации контекста базы данных Entity Framework. Он указывает, какой класс наследуется отDbContextбудет использоваться для работы с БД. Параметрoptionsпозволяет настроить подключение.UseNpgsql(...)— метод, указывающий использовать драйвер Npgsql для подключения к PostgreSQL. Строка подключения берется из конфигурации.Configure<S3Settings>— метод для привязки секции конфигурации к классуS3Settings. Это позволяет читать настройки из файлаappsettings.jsonи использовать их в коде как strongly-typed объект.GetSection("S3")— метод получения секции конфигурации с именем "S3". Эта секция содержит все параметры, связанные с объектным хранилищем.AddSingleton<IMinioClient>— регистрация сервиса типаIMinioClientкак одиночного экземпляра (Singleton). Это означает, что один и тот же объект клиента MinIO будет использоваться во всем жизненном цикле приложения, что экономит ресурсы и улучшает производительность.sp.GetRequiredService<IConfiguration>()— получение сервиса конфигурации из контейнера зависимостей.sp— это поставщик сервисов (ServiceProvider), который предоставляет доступ к зарегистрированным сервисам.MinioClient()— конструктор класса клиента MinIO. Методы.WithEndpoint(),.WithCredentials()и.Build()позволяют настроить адрес сервера, ключи доступа и создать финальный объект клиента.AddControllers()— регистрация контроллеров MVC. Это позволяет системе автоматически обнаруживать и маршрутизировать запросы к классам, помеченным атрибутом[ApiController].AddEndpointsApiExplorer()иAddSwaggerGen()— методы для включения поддержки Swagger. Первый метод добавляет метаданные API, второй генерирует документацию.app.UseSwagger()иapp.UseSwaggerUI()— middleware, включающие генерацию и отображение документации Swagger в браузере. Они работают только в режиме разработки (IsDevelopment).UseAuthorization()— middleware, проверяющая права доступа пользователей к защищенным ресурсам.MapControllers()— метод, который настраивает маршрутизацию для контроллеров. Он сопоставляет URL-адреса с методами контроллеров.Run()— запускает приложение и начинает слушать входящие HTTP-запросы.- Класс
S3Settings— модель для хранения настроек подключения к S3. Используется для сильной типизации конфигурации. Поля содержат адрес, регион, имя бакета, флаг SSL и учетные данные. - Класс
ApplicationDbContext— контекст базы данных, наследующийся отDbContext. Определяет связь между классами C# и таблицами базы данных. Конструктор принимает настройки подключения. DbSet<FileMetadata>— свойство, представляющее таблицуFilesв базе данных. Entity Framework автоматически создаст эту таблицу на основе свойств классаFileMetadata.- Класс
FileMetadata— модель данных, описывающая метаданные файла. Свойства соответствуют столбцам таблицы: уникальный идентификатор, оригинальное имя, ключ в S3, размер, тип контента и дата создания.
Файл appsettings.json
Файл appsettings.json содержит конфигурационные данные приложения.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=s3_media_db;Username=postgres;Password=1"
},
"S3": {
"Endpoint": "http://localhost:9000",
"Region": "us-east-1",
"BucketName": "s3-media-manager-files",
"UseSSL": false,
"AccessKey": "minioadmin",
"SecretKey": "minioadmin"
}
}
Logging— секция для настройки логирования. УровеньInformationвыводит информационные сообщения,Warning— предупреждения.AllowedHosts— список разрешенных хостов. Звездочка*означает разрешение любых хостов.ConnectionStrings— раздел для строк подключения к базам данных. КлючDefaultConnectionиспользуется в коде для получения строки подключения к PostgreSQL. Строка содержит хост, порт, имя базы данных, пользователя и пароль.S3— секция настроек для MinIO/S3. Содержит адрес эндпоинта, регион (необязательно для MinIO, но требуется по спецификации), имя бакета, флаг использования SSL и учетные данные.
Файл FilesController.cs
Контроллер отвечает за обработку HTTP-запросов, связанных с файлами.
using Microsoft.AspNetCore.Mvc;
using Minio;
using Minio.DataModel.Args;
using Minio.Exceptions;
using S3MediaManager.Models;
using System.IO;
using Microsoft.EntityFrameworkCore;
namespace S3MediaManager.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class FilesController : ControllerBase
{
private readonly IMinioClient _minioClient;
private readonly ApplicationDbContext _context;
private readonly IConfiguration _config;
public FilesController(IMinioClient minioClient, ApplicationDbContext context, IConfiguration config)
{
_minioClient = minioClient;
_context = context;
_config = config;
}
[HttpPost("upload")]
[RequestSizeLimit(500 * 1024 * 1024)]
public async Task<IActionResult> UploadFile(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("Файл не выбран или пуст.");
try
{
var extension = Path.GetExtension(file.FileName);
var uniqueFileName = $"{Guid.NewGuid()}{extension}";
var bucketName = _config["S3:BucketName"];
await using var stream = new MemoryStream();
await file.CopyToAsync(stream);
stream.Position = 0;
// Проверка и создание бакета при необходимости
try
{
await _minioClient.BucketExistsAsync(new BucketExistsArgs().WithBucket(bucketName));
}
catch (BucketNotFoundException)
{
await _minioClient.MakeBucketAsync(new MakeBucketArgs().WithBucket(bucketName));
}
// Загрузка файла
await _minioClient.PutObjectAsync(new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(uniqueFileName)
.WithStreamData(stream)
.WithObjectSize(file.Length)
.WithContentType(file.ContentType ?? "application/octet-stream"));
// Сохранение метаданных
var metadata = new FileMetadata
{
OriginalName = file.FileName,
S3Key = uniqueFileName,
Size = file.Length,
ContentType = file.ContentType ?? "application/octet-stream",
CreatedAt = DateTime.UtcNow
};
_context.Files.Add(metadata);
await _context.SaveChangesAsync();
return Ok(new
{
message = "Файл успешно загружен",
fileName = uniqueFileName,
originalName = file.FileName,
size = file.Length
});
}
catch (Exception ex)
{
return StatusCode(500, $"Ошибка S3: {ex.Message}");
}
}
[HttpGet]
public async Task<ActionResult<IEnumerable<FileMetadata>>> GetFiles()
{
return await _context.Files.ToListAsync();
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteFile(int id)
{
var file = await _context.Files.FindAsync(id);
if (file == null)
return NotFound();
try
{
var bucketName = _config["S3:BucketName"];
await _minioClient.RemoveObjectAsync(new RemoveObjectArgs()
.WithBucket(bucketName)
.WithObject(file.S3Key));
_context.Files.Remove(file);
await _context.SaveChangesAsync();
return NoContent();
}
catch (Exception ex)
{
return StatusCode(500, "Ошибка удаления файла");
}
}
}
}
Разбор кода FilesController.cs
[Route("api/[controller]")]— атрибут, определяющий базовый маршрут для всех методов контроллера.[controller]заменяется на имя контроллера (без суффикса Controller), то естьapi/files.[ApiController]— атрибут, включающий специальные возможности для контроллеров API: автоматическую валидацию модели, возврат ошибок 400 при неверных данных и использование статус-кодов HTTP.IMinioClient,ApplicationDbContext,IConfiguration— поля класса, которые заполняются автоматически через конструктор благодаря внедрению зависимостей._minioClientиспользуется для работы с хранилищем,_context— для базы данных,_config— для чтения настроек.UploadFile(IFormFile file)— метод обработки POST-запроса на загрузку файла. ПараметрIFormFileпредставляет загруженный файл.[HttpPost("upload")]— атрибут, указывающий, что метод обрабатывает запросы с методом POST и путем/upload. Полный путь будетapi/files/upload.[RequestSizeLimit(500 * 1024 * 1024)]— ограничение размера загружаемого файла. Максимум 500 МБ.Path.GetExtension(file.FileName)— получение расширения файла из его имени. Например,.jpgили.pdf.Guid.NewGuid()— генерация уникального идентификатора (GUID), который используется для создания уникального имени файла в хранилище, чтобы избежать коллизий.MemoryStream— поток в памяти, используемый для временного хранения данных файла перед загрузкой в S3.file.CopyToAsync(stream)— асинхронное копирование содержимого загруженного файла в поток.BucketExistsAsync— асинхронная проверка существования бакета. Возвращает true, если бакет существует.MakeBucketAsync— создание нового бакета, если он не найден.PutObjectAsync— загрузка объекта (файла) в бакет. Аргументы содержат имя бакета, имя объекта, поток данных, размер и тип контента._context.Files.Add(metadata)— добавление новой записи в контекст базы данных.SaveChangesAsync()— сохранение изменений в базе данных. Выполняет INSERT-запрос.Ok(...)— возвращает ответ с кодом 200 OK и телом ответа в формате JSON.StatusCode(500, ...)— возвращает ошибку сервера с текстом ошибки.ToListAsync()— асинхронное получение всех записей из базы данных и преобразование их в список.FindAsync(id)— поиск записи по первичному ключу.Remove(file)— удаление записи из контекста.NoContent()— возвращает ответ с кодом 204 No Content, означающий успешное удаление без тела ответа.
Применение миграций
После создания моделей необходимо применить изменения к базе данных.
Откройте окно Package Manager Console в Visual Studio (меню Вид -> Другие окна -> Package Manager Console).
Выполните команду Add-Migration InitialCreate для создания миграции.
Затем выполните Update-Database для применения миграции и создания таблиц в базе данных PostgreSQL.
Зачем оно нужно?
Созданное приложение демонстрирует полноценный цикл работы с файлами в современной архитектуре. Использование API позволяет интегрировать сервис с любыми клиентами: веб-сайтами, мобильными приложениями или десктопными программами.
Система обеспечивает надежное хранение файлов в объектном хранилище и быстрое управление метаданными в базе данных.
Масштабируемость достигается за счет разделения ответственности между компонентами и возможности независимого масштабирования хранилища и базы данных.
Применение Docker упрощает развертывание и тестирование, а использование современных библиотек и фреймворков обеспечивает безопасность и производительность. Такой подход формирует прочную основу для развития сложных информационных систем.