Перейти к основному содержимому

Первая программа на ASP.NET Core

Разработчику Архитектору
Загрузка симулятора первой программы…

Первая программа на ASP.NET Core

Соберём минимальный REST API на C# — без БД и облака. Сложный пример с PostgreSQL и S3: 453.md. Обзор платформы: ASP.NET. UI: Blazor · MAUI.


Требования

  • .NET SDK 8 или 9 (dotnet --version)
  • Редактор: Visual Studio, Rider или VS Code + C# Dev Kit

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

dotnet new webapi -n HelloApi -o HelloApi --use-controllers
cd HelloApi
dotnet run

Откройте https://localhost:7xxx/swagger (порт в консоли). Шаблон уже содержит sample controller.


Минимальный API (без контроллеров)

Удалите контроллеры и замените Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}

app.MapGet("/health", () => Results.Ok(new { status = "ok" }));

app.MapGet("/hello/{name}", (string name) =>
Results.Ok(new { message = $"Hello, {name}!" }));

app.Run();
dotnet run
curl https://localhost:5001/health -k
curl https://localhost:5001/hello/World -k

Вариант с контроллером

Controllers/NotesController.cs:

using Microsoft.AspNetCore.Mvc;

namespace HelloApi.Controllers;

[ApiController]
[Route("api/[controller]")]
public class NotesController : ControllerBase
{
private static readonly List<Note> Notes = new();

[HttpGet]
public ActionResult<IEnumerable<Note>> GetAll() => Ok(Notes);

[HttpPost]
public ActionResult<Note> Create(NoteCreate dto)
{
var note = new Note { Id = Notes.Count + 1, Text = dto.Text };
Notes.Add(note);
return CreatedAtAction(nameof(GetAll), new { id = note.Id }, note);
}
}

public record Note(int Id, string Text);
public record NoteCreate(string Text);

Внедрение зависимостей

Services/IGreetingService.cs:

public interface IGreetingService
{
string Greet(string name);
}

public class GreetingService : IGreetingService
{
public string Greet(string name) => $"Hello, {name}!";
}

Program.cs:

builder.Services.AddSingleton<IGreetingService, GreetingService>();

app.MapGet("/greet/{name}", (string name, IGreetingService svc) =>
Results.Ok(new { message = svc.Greet(name) }));

Тестирование (xUnit)

dotnet new xunit -n HelloApi.Tests
dotnet add HelloApi.Tests reference HelloApi
dotnet add HelloApi.Tests package Microsoft.AspNetCore.Mvc.Testing
public class HealthTests : IClassFixture<WebApplicationFactory<Program>>
{
private readonly HttpClient _client;

public HealthTests(WebApplicationFactory<Program> factory)
{
_client = factory.CreateClient();
}

[Fact]
public async Task Health_ReturnsOk()
{
var res = await _client.GetAsync("/health");
res.EnsureSuccessStatusCode();
}
}
dotnet test

Публикация

dotnet publish -c Release -o ./publish

Запуск на сервере: dotnet HelloApi.dll или Docker-образ на базе mcr.microsoft.com/dotnet/aspnet.


Дальше


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).