Aspnet Core

by mindrally97184105b5daNo license269 starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 5 weeks ago

Guidelines for ASP.NET Core web development covering API design, authentication, caching, and best practices

Instructions onlySoftware Development
AI-generated overview

Guidelines for ASP.NET Core web development covering API design, authentication, caching, and best practices.

What it does
This skill provides reference guidance for building ASP.NET Core web applications and APIs. It covers project structure, RESTful controller design, middleware ordering, caching strategies, JWT authentication and policy-based authorization, error handling, validation, configuration, and Swagger/OpenAPI documentation. It produces code examples and conventions rather than executable artifacts.
When to use it
Use it when designing or implementing ASP.NET Core APIs and web services. It is suited to questions about controllers, middleware, caching, authentication, authorization, validation, or API documentation in ASP.NET Core.
Requirements
No scripts or tooling are included; it is instructions only. Applying the examples assumes an ASP.NET Core project and familiarity with C#, with optional packages such as FluentValidation, Redis distributed caching, and Swagger/OpenAPI.

ASP.NET Core Development Guidelines

You are an expert in ASP.NET Core development with deep knowledge of web API design, authentication, middleware, and performance optimization.

Project Structure

src/  Controllers/      # API endpoints  Models/          # Domain models and DTOs  Services/        # Business logic  Data/            # DbContext and repositories  Middleware/      # Custom middleware  Extensions/      # Extension methods  Configuration/   # App configurationProgram.csappsettings.json

Controller Design

RESTful Controllers

csharp
[ApiController][Route("api/[controller]")]public class ProductsController : ControllerBase{    private readonly IProductService _productService;
    public ProductsController(IProductService productService)    {        _productService = productService;    }
    [HttpGet]    public async Task<ActionResult<IEnumerable<ProductDto>>> GetProducts()    {        var products = await _productService.GetAllAsync();        return Ok(products);    }
    [HttpGet("{id}")]    public async Task<ActionResult<ProductDto>> GetProduct(int id)    {        var product = await _productService.GetByIdAsync(id);        if (product == null)            return NotFound();        return Ok(product);    }
    [HttpPost]    public async Task<ActionResult<ProductDto>> CreateProduct(CreateProductDto dto)    {        var product = await _productService.CreateAsync(dto);        return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);    }}

Best Practices

  • Keep controllers thin
  • Use DTOs for request/response
  • Return appropriate status codes
  • Use async/await consistently
  • Implement proper validation

Middleware

Custom Middleware

csharp
public class RequestLoggingMiddleware{    private readonly RequestDelegate _next;    private readonly ILogger<RequestLoggingMiddleware> _logger;
    public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)    {        _next = next;        _logger = logger;    }
    public async Task InvokeAsync(HttpContext context)    {        _logger.LogInformation("Request: {Method} {Path}", context.Request.Method, context.Request.Path);        await _next(context);        _logger.LogInformation("Response: {StatusCode}", context.Response.StatusCode);    }}

Middleware Order

  1. Exception handling
  2. HTTPS redirection
  3. Static files
  4. Routing
  5. CORS
  6. Authentication
  7. Authorization
  8. Custom middleware
  9. Endpoints

Caching

Response Caching

csharp
[HttpGet][ResponseCache(Duration = 60)]public async Task<ActionResult<IEnumerable<ProductDto>>> GetProducts()

Memory Caching

csharp
public class ProductService : IProductService{    private readonly IMemoryCache _cache;
    public async Task<Product?> GetByIdAsync(int id)    {        return await _cache.GetOrCreateAsync($"product_{id}", async entry =>        {            entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);            return await _repository.GetByIdAsync(id);        });    }}

Distributed Caching

  • Use Redis for multi-server scenarios
  • Configure in Program.cs
  • Use IDistributedCache interface

Authentication

JWT Configuration

csharp
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)    .AddJwtBearer(options =>    {        options.TokenValidationParameters = new TokenValidationParameters        {            ValidateIssuer = true,            ValidateAudience = true,            ValidateLifetime = true,            ValidateIssuerSigningKey = true,            ValidIssuer = builder.Configuration["Jwt:Issuer"],            ValidAudience = builder.Configuration["Jwt:Audience"],            IssuerSigningKey = new SymmetricSecurityKey(                Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]!))        };    });

Token Generation

csharp
public string GenerateToken(User user){    var claims = new[]    {        new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),        new Claim(ClaimTypes.Email, user.Email),        new Claim(ClaimTypes.Role, user.Role)    };
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]!));    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    var token = new JwtSecurityToken(        issuer: _config["Jwt:Issuer"],        audience: _config["Jwt:Audience"],        claims: claims,        expires: DateTime.UtcNow.AddHours(1),        signingCredentials: creds);
    return new JwtSecurityTokenHandler().WriteToken(token);}

Authorization

Policy-Based Authorization

csharp
builder.Services.AddAuthorization(options =>{    options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));    options.AddPolicy("PremiumUser", policy => policy.RequireClaim("Subscription", "Premium"));});
[Authorize(Policy = "AdminOnly")][HttpDelete("{id}")]public async Task<IActionResult> DeleteProduct(int id)

Error Handling

Global Exception Handler

csharp
app.UseExceptionHandler(errorApp =>{    errorApp.Run(async context =>    {        context.Response.StatusCode = 500;        context.Response.ContentType = "application/json";
        var error = context.Features.Get<IExceptionHandlerFeature>();        if (error != null)        {            await context.Response.WriteAsJsonAsync(new            {                error = "An error occurred",                detail = app.Environment.IsDevelopment() ? error.Error.Message : null            });        }    });});

Validation

FluentValidation

csharp
public class CreateProductValidator : AbstractValidator<CreateProductDto>{    public CreateProductValidator()    {        RuleFor(x => x.Name).NotEmpty().MaximumLength(100);        RuleFor(x => x.Price).GreaterThan(0);        RuleFor(x => x.Category).NotEmpty();    }}

Configuration

Options Pattern

csharp
builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("Smtp"));
public class EmailService{    private readonly SmtpSettings _settings;
    public EmailService(IOptions<SmtpSettings> options)    {        _settings = options.Value;    }}

Documentation

Swagger/OpenAPI

csharp
builder.Services.AddSwaggerGen(c =>{    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme    {        Type = SecuritySchemeType.Http,        Scheme = "bearer",        BearerFormat = "JWT"    });});

Source and attribution

Source:mindrally/skillsinaspnet-coreat commit9718410

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal