Answer: Ensures API request data is valid before processing. Automatically triggered using Data Annotations.
public class Product
{
[Required] public string Name { get; set; }
[Range(1, 10000)] public decimal Price { get; set; }
}
[HttpPost]
public IActionResult Create(Product product)
{
if(!ModelState.IsValid) return BadRequest(ModelState);
return Ok(product);
}
Answer:
public ActionResult<Product> Get(int id)
{
var product = _context.Products.Find(id);
if(product == null) return NotFound();
return product;
}
Answer: Filters run before/after controller actions for cross-cutting concerns like logging or authorization.
public class LogActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
=> Console.WriteLine("Before Action");
public void OnActionExecuted(ActionExecutedContext context)
=> Console.WriteLine("After Action");
}
Answer:
app.Use(async (ctx, next) => { await next(); });
app.Run(async ctx => { await ctx.Response.WriteAsync("End"); });
Answer: Use User Secrets, environment variables, or Azure Key Vault.
dotnet user-secrets set "JWT:Secret" "supersecretkey"
var key = builder.Configuration["JWT:Secret"];
Answer: Provides endpoint to monitor API health.
builder.Services.AddHealthChecks();
app.MapHealthChecks("/health");
Answer: Auto-generates API docs with UI to test endpoints.
builder.Services.AddSwaggerGen();
app.UseSwagger();
app.UseSwaggerUI();
Answer:
return Ok();
return CreatedAtAction(...);
return BadRequest();
return NotFound();
Answer:
return Ok(new { Id=1, Name="Laptop" });
Answer:
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/products")]
public class ProductsV1Controller : ControllerBase {}
[HttpPost("upload")]
public async Task Upload(IFormFile file)
{
using var stream = new FileStream($"uploads/{file.FileName}", FileMode.Create);
await file.CopyToAsync(stream);
return Ok();
}
var data = _context.Products
.Where(p => p.Price > minPrice)
.OrderBy(p => p.Name)
.Skip((page-1)*size)
.Take(size)
.ToList();
builder.Services.AddHttpClient();
var client = _httpClientFactory.CreateClient();
var products = _cache.GetOrCreate("products", e=>_context.Products.ToList());
app.MapHub<ChatHub>("/chat");
_logger.LogInformation("Fetched {Count} products", products.Count);
builder.Services.AddRateLimiter(...);
[Timestamp] public byte[] RowVersion { get; set; }
return Ok(new { Id=1, Name="Laptop", Links=new[]{ "/products/1" } });
app.MapGet("/products", () => _context.Products.ToList());
[Fact] public void Get_ReturnsOk()
{
Assert.IsType<OkObjectResult>(controller.Get());
}
app.UseExceptionHandler("/error");
[Authorize]
public IActionResult GetSecureData() => Ok("Secure");