Гид по технологиям

Создание API на ASP.NET с MongoDB: от проекта до деплоя

8 min read Backend Обновлено 28 Nov 2025
ASP.NET + MongoDB: полное руководство
ASP.NET + MongoDB: полное руководство

asp.net

Быстрые ссылки

  • Создание проекта

  • Подключение к базе данных

  • Создание CRUD-сервиса

  • Настройка API-контроллера

О чём эта статья

Это практическое руководство по созданию простого REST API на ASP.NET Core с использованием MongoDB. Мы пройдём через создание проекта в Visual Studio, определение модели данных, конфигурацию подключений, реализацию сервиса уровня данных (CRUD), создание контроллера, базовое тестирование и выпуск в продакшен. Также включены рекомендации по безопасности, тестированию, наблюдаемости, бэкапу и миграции.

Кому полезно: разработчикам .NET, инженерам DevOps, тестировщикам и архитектам, которые хотят быстро поднять API на ASP.NET с документной базой данных.

Important: примеры ориентированы на локальную разработку. Для продакшена добавьте шифрование секретов, мониторинг и безопасную конфигурацию.


1. Создание проекта

Для удобства используем Visual Studio: она поставляется с готовыми шаблонами и интеграцией .NET. Создайте новое приложение — шаблон “ASP.NET Core Web Application” и выберите профиль API.

create new project

Дайте проекту имя и выберите режим “API” — нам не нужен фронтенд на Razor Pages.

select API

Запустив проект (кнопка запуска с профилем IIS Express), вы увидите стартовую страницу с заглушкой (например, демонстрационные данные о погоде). Это стандартный скелет, на котором мы будем строить сервис.

dummy data

Краткое определение: ASP.NET Core — кроссплатформенный фреймворк для создания веб-API и веб-приложений на C# и .NET.

2. Подключение к базе данных

Хорошая практика — разделять логику обработки HTTP-запросов (контроллеры) и доступ к данным (сервис/репозиторий). Мы создадим сервис данных, который инкапсулирует доступ к MongoDB, и контроллер, который будет вызывать сервис.

  1. Установите пакет драйвера MongoDB для .NET: в NuGet Manager найдите и установите пакет MongoDB.Driver.

install nugest packages

Почему MongoDB? Документные БД естественно соответствуют коллекциям объектов (List) и драйвер поддерживает LINQ-подобные запросы. Но если вы используете реляционную БД, выберите соответствующий провайдер EntityFrameworkCore.

  1. Создайте папку Models в корне проекта. В ней определим схему сущности User и класс настроек подключения.

Пример модели User (файл User.cs):

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System;

namespace ExampleService.Models
{
    public class User
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }

        [BsonElement("Name")]
        public string Name { get; set; }

        public string Email { get; set; }

        // дополнительные поля по необходимости
    }
}

Пояснение: атрибуты [BsonId] и [BsonRepresentation(BsonType.ObjectId)] позволяют использовать строковый Id в коде, тогда как MongoDB хранит его как ObjectId.

  1. Класс настроек подключения (DatabaseSettings.cs):
namespace ExampleService.Models
{
    public class ExampleDatabaseSettings : IExampleDatabaseSettings
    {
        public string ExampleCollectionName { get; set; }
        public string ConnectionString { get; set; }
        public string DatabaseName { get; set; }
    }

    public interface IExampleDatabaseSettings
    {
        string ExampleCollectionName { get; set; }
        string ConnectionString { get; set; }
        string DatabaseName { get; set; }
    }
}
  1. Добавьте настройки в appsettings.json:
"ExampleDatabaseSettings": {
  "ExampleCollectionName": "Users",
  "ConnectionString": "mongodb://localhost:27017",
  "DatabaseName": "Example"
}

Создайте базу данных Example и коллекцию Users в MongoDB (локально или удалённо).

  1. Зарегистрируйте настройки в Startup.cs (или Program.cs для .NET 6+). В методе ConfigureServices добавьте привязку конфигурации и регистрацию через DI:
public void ConfigureServices(IServiceCollection services)
{
    services.Configure(
        Configuration.GetSection(nameof(ExampleDatabaseSettings)));

    services.AddSingleton(sp =>
        sp.GetRequiredService>().Value);

    services.AddControllers();
}

Если у вас .NET 6/7 с минимальным хостом, подобная конфигурация выполняется в Program.cs через builder.Services.Configure<…>().

Notes: убедитесь, что у вас подключён namespace ExampleService.Models в Startup/Program.

3. Написание CRUD-сервиса для работы с базой

Сервис инкапсулирует IMongoCollection и предоставляет методы получения, создания, обновления и удаления.

Пример сервиса (ExampleService.cs):

using ExampleService.Models;
using MongoDB.Driver;
using System.Collections.Generic;
using System.Linq;

namespace ExampleService.Services
{
    public class ExampleService
    {
        private readonly IMongoCollection _users;

        public ExampleService(IExampleDatabaseSettings settings)
        {
            var client = new MongoClient(settings.ConnectionString);
            var database = client.GetDatabase(settings.DatabaseName);
            _users = database.GetCollection(settings.ExampleCollectionName);
        }

        public List Get() =>
            _users.Find(user => true).ToList();

        public User Get(string id) =>
            _users.Find(user => user.Id == id).FirstOrDefault();

        public User Create(User user)
        {
            _users.InsertOne(user);
            return user;
        }

        public void Update(string id, User userIn) =>
            _users.ReplaceOne(user => user.Id == id, userIn);

        public void Remove(User userIn) =>
            _users.DeleteOne(user => user.Id == userIn.Id);

        public void Remove(string id) =>
            _users.DeleteOne(user => user.Id == id);
    }
}

Пояснения:

  • IMongoCollection — потокобезопасный объект коллекции; можно выполнять LINQ-совместимые запросы.
  • Методы простые для наглядности; в реальном проекте добавьте валидацию и обработку ошибок.
  1. Зарегистрируйте сервис в DI в Startup/Program:
services.AddSingleton();

4. Настройка API-контроллера

Visual Studio упрощает создание контроллера: правой кнопкой по папке Controllers -> Add -> Controller.

Right-click on

Пример контроллера (ExampleController.cs):

using ExampleService.Models;
using ExampleService.Services;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

[Route("api/[controller]")]
[ApiController]
public class ExampleController : ControllerBase
{
    private readonly ExampleService _exampleService;

    public ExampleController(ExampleService exampleService)
    {
        _exampleService = exampleService;
    }

    [HttpGet]
    public ActionResult> Get()
    {
        return _exampleService.Get();
    }

    [HttpGet("{id}", Name = "GetUser")]
    public ActionResult Get(string id)
    {
        var user = _exampleService.Get(id);
        if (user == null)
        {
            return NotFound();
        }
        return user;
    }

    [HttpPost]
    public ActionResult Create(User userIn)
    {
        _exampleService.Create(userIn);
        return CreatedAtRoute("GetUser", new { id = userIn.Id.ToString() }, userIn);
    }

    [HttpPut("{id}")]
    public IActionResult Update(string id, User userIn)
    {
        var existing = _exampleService.Get(id);
        if (existing == null)
        {
            return NotFound();
        }
        _exampleService.Update(id, userIn);
        return NoContent();
    }

    [HttpDelete("{id}")]
    public IActionResult Delete(string id)
    {
        var user = _exampleService.Get(id);
        if (user == null)
        {
            return NotFound();
        }
        _exampleService.Remove(id);
        return NoContent();
    }
}

Пояснение: ActionResult удобно возвращает либо данные, либо HTTP-код. CreatedAtRoute используется для ответа 201 с заголовком Location.

5. Локальное тестирование и отладка

  • Запустите проект через IIS Express или Kestrel.
  • Проверьте маршруты через Postman, curl или встроенный Swagger (если подключили Swashbuckle).
  • По умолчанию корневая точка может быть стартовой заглушкой — измените Debug Launch URL в Project > Properties > Debug.

change debug route

Примеры запросов:

  • GET /api/example — получить всех пользователей
  • GET /api/example/{id} — получить пользователя по id
  • POST /api/example — создать пользователя (тело JSON)
  • PUT /api/example/{id} — обновить
  • DELETE /api/example/{id} — удалить

6. Деплой и сборка в продакшен

Для публикации используйте Build > Publish. Можно выбрать File System, Docker или облако. В опциях укажите:

  • Self-contained или framework-dependent build
  • Однофайловую публикацию (single file) при необходимости
  • Целевую Runtime Identifier (например, linux-x64) если ориентируетесь на Linux-сервер

production build settings

Если публикуете на Linux и используете .csproj, добавьте:

linux-x64

Для контейнеризации используйте Dockerfile с базовым образом mcr.microsoft.com/dotnet/aspnet или sdk для сборки. CI/CD: добавьте шаги сборки, тестов, security-scan и деплоя.

7. Безопасность и аутентификация

Это руководство демонстрационное, поэтому API не защищён. В реальном приложении нужно:

  • Включить HTTPS и принудительный редирект на TLS
  • Настроить аутентификацию (JWT для API). В ASP.NET есть встроенная поддержка JWT через Microsoft.AspNetCore.Authentication.JwtBearer
  • Ограничивать права доступа ролями или политиками (Authorization)
  • Ограничивать CORS только доверенными доменами
  • Хранить строки подключения и секреты в безопасном хранилище (Azure Key Vault, AWS Secrets Manager, HashiCorp Vault или в User Secrets для разработки)
  • Логировать попытки доступа и применять rate limiting

Пример добавления JWT (вкратце):

  • Добавьте пакет Microsoft.AspNetCore.Authentication.JwtBearer
  • В ConfigureServices добавьте JWT-схему и параметры валидации ключа/issuer/audience
  • Пометьте защищённые контроллеры [Authorize]

Security hardening: шифрование полей чувствительных данных на уровне приложения, включение мониторинга инцидентов, аудит доступа к данным.

8. Наблюдаемость, логирование и бэкап

  • Логирование: используйте Serilog или Microsoft.Extensions.Logging с выводом в файл, ElasticSearch или облачные сервисы.
  • Метрики: Prometheus + Grafana или Application Insights.
  • Бэкап MongoDB: регулярные дампы mongodump или облачные механизмы бэкапа.
  • Репликация: используйте replica set для высокой доступности.

9. Производительность и масштабирование

  • Добавляйте индексы в MongoDB по полям, используемым в фильтрах/сортировках.
  • Пагинация вместо получения всех документов.
  • Пакетные операции BulkWrite для массовых вставок/обновлений.
  • Кеширование часто запрашиваемых данных (Redis).

10. Тестирование и приемка

Минимальный набор тестов:

  • Unit-тесты для логики сервиса (мок IMongoCollection / MongoDB Driver адаптер)
  • Интеграционные тесты с тестовой базой (контейнер MongoDB или in-memory тестовая БД)
  • Контрактные тесты для API (проверка ответов и схемы JSON)

Примеры тест-кейсов:

  • Создать пользователя — ожидать 201 и корректный Location
  • Получить несуществующий id — ожидать 404
  • Обновить пользователя — ожидать 204 и корректные изменения
  • Удалить пользователя — ожидать 204 и невозможность получить ресурс потом

Критерии приёмки:

  • Все основные CRUD-эндпойнты возвращают ожидаемые коды и данные
  • Логирование запросов присутствует
  • Секьюрность: хотя бы базовая проверка JWT и HTTPS

11. Поддержка и миграция данных

  • Документные БД не имеют схемы в строгом виде — контролируйте изменения модели через миграционные скрипты приложения или миграции на уровне данных.
  • Для миграции полей: пишите скрипты трансформации, запускайте их под контролем (например, в отдельном миграционном сервисе).
  • Версионирование API: добавляйте версию в маршрут (/api/v1/…), чтобы не ломать клиентов при рефакторинге.

12. Альтернативные подходы

  • Реляционная БД + EF Core: если требуются транзакции и строгая схема — используйте SQL Server/PostgreSQL с EF Core.
  • DDD / Repository + Unit of Work: для сложных предметных областей применяйте слои абстракции.
  • Использование MongoDB BsonClassMap или подобных инструментов для маппинга сложных типов.

13. Когда этот подход не подходит

Counterexamples:

  • Нужны сложные JOIN-операции и строгая целостность ссылок — лучше реляционная БД.
  • Требуется ACID-транзакция на уровне множества коллекций (хотя MongoDB поддерживает многоадресные транзакции в некоторых сценариях, это не всегда удобно).
  • Высокие требования к аналитике и OLAP-запросам — рассмотреть отдельный аналитический хранилище.

14. Рекомендации по локализации и соответствию GDPR

Если приложение хранит персональные данные (имена, email, IP и т.д.), учтите:

  • Минимизируйте собираемые данные и храните их не дольше, чем нужно.
  • Обеспечьте возможность удаления или анонимизации данных по запросу пользователя.
  • Шифруйте персональные данные в состоянии покоя и при передаче.
  • Документируйте основания обработки данных и уведомляйте пользователей.

Privacy notes: используйте механизмы удаления и лога изменений для аудита. Храните резервные копии в зашифрованном виде.

15. Чек-листы и роли

Разработчик:

  • Создать модель и настройки
  • Реализовать сервис CRUD
  • Написать unit-тесты
  • Настроить логирование

DevOps:

  • Настроить CI/CD сборку и тесты
  • Обеспечить безопасное хранение секретов
  • Настроить бэкап MongoDB и мониторинг

QA:

  • Провести API-тесты (позитивные и негативные)
  • Проверить сценарии авторизации
  • Проверить устойчивость при отказах БД

16. Шаблоны и сниппеты

appsettings.json (фрагмент):

{
  "ExampleDatabaseSettings": {
    "ExampleCollectionName": "Users",
    "ConnectionString": "mongodb://localhost:27017",
    "DatabaseName": "Example"
  }
}

Dockerfile (пример для ASP.NET Core):

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyProject.csproj", "./"]
RUN dotnet restore "MyProject.csproj"
COPY . ./
RUN dotnet publish "MyProject.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish ./
ENTRYPOINT ["dotnet", "MyProject.dll"]

CI-пайплайн (коротко):

  • Checkout
  • Restore и сборка
  • Unit-тесты
  • Static analysis / security scan
  • Publish артефактов
  • Deploy в staging, run smoke tests
  • Promote to production

17. Примеры ошибок и пути их решения

  • Не удаётся подключиться к MongoDB — проверьте ConnectionString, доступность порта и firewall.
  • NullReference в сервисе — проверьте регистрацию сервиса в DI.
  • ID не конвертируется — убедитесь, что используете [BsonRepresentation(BsonType.ObjectId)].

18. Рекомендации по дальнейшему расширению

  • Добавьте DTO и AutoMapper для отделения внешней представления данных от внутренней модели.
  • Внедрите пагинацию и фильтрацию для GET-методов.
  • Добавьте rate limiting и защиту от DDoS.

19. Полезная справка и термины

1-line glossary:

  • API — интерфейс для взаимодействия через HTTP.
  • DI — внедрение зависимостей, механизм конфигурации сервисов в ASP.NET.
  • DTO — объект передачи данных.
  • Bson — формат BSON, используемый MongoDB для хранения документов.

Fact box:

  • MongoDB обычно хранит идентификатор документа как ObjectId, но в C# можно представлять его строкой с помощью BsonRepresentation.
  • IMongoCollection безопасен для многопоточных операций.

Краткое резюме

  • Создайте проект API в Visual Studio.
  • Подключите MongoDB драйвер и определите модель и настройки.
  • Реализуйте сервис CRUD и зарегистрируйте его в DI.
  • Создайте контроллеры и протестируйте локально.
  • Добавьте безопасность, логирование и мониторинг перед деплоем.

Если нужны примеры для .NET 6 minimal APIs, Docker Compose с MongoDB или шаблоны CI для GitHub Actions — скажите, и я подготовлю их отдельно.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство