Help me een C#-toepassing maken die een aangepaste middleware implementeert voor verzoekvalidatie.
description
Door deze middleware te implementeren, kun je de beveiliging en betrouwbaarheid van je applicatie verbeteren, zodat alleen geldige gegevens worden verwerkt, wat fouten kan verminderen en de gebruikerservaring kan verbeteren.
prompt
try_prompt
Ik wil een C# middleware bouwen die HTTP-verzoeken onderschept om binnenkomende gegevens te valideren tegen specifieke regels. Leg alsjeblieft uit hoe je de mi ... more
generate_helper
...
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van hoe je een C# middleware kunt bouwen die binnenkomende HTTP-verzoeken onderschept, valideert of de gegevens voldoen aan de regel dat het een geldig e-mailadres is, en vervolgens afhandelt indien de validatie faalt.
1. Middleware maken
2. Validatieregels definiëren
3. Fouten afhandelen en reageren
**Stap 1: Middleware maken**
Je maakt een klasse die de `IMiddleware` interface implementeert of een middleware met een `RequestDelegate`. Bijvoorbeeld:
```csharp
public class EmailValidationMiddleware
{
private readonly RequestDelegate _next;
public EmailValidationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// Lees de request body (bijvoorbeeld JSON)
context.Request.EnableBuffering();
using var reader = new StreamReader(context.Request.Body, Encoding.UTF8, leaveOpen: true);
var body = await reader.ReadToEndAsync();
// Reset de stream positie zodat volgende middleware het kan lezen
context.Request.Body.Position = 0;
// Valideer de gegevens
if (!IsValidEmailInBody(body))
{
// Reageer met foutmelding
context.Response.StatusCode = StatusCodes.Status400BadRequest;
await context.Response.WriteAsync("Ongeldig e-mailadres.");
return; // Stop verdere verwerking
}
// Ga door naar de volgende middleware
await _next(context);
}
private bool IsValidEmailInBody(string body)
{
// Veronderstel dat de body JSON is met een veld "email"
try
{
var jsonDoc = JsonDocument.Parse(body);
if (jsonDoc.RootElement.TryGetProperty("email", out var emailProperty))
{
var email = emailProperty.GetString();
return IsValidEmail(email);
}
}
catch
{
// Fout bij parsing betekent invalid
return false;
}
return false;
}
private bool IsValidEmail(string email)
{
if (string.IsNullOrEmpty(email))
return false;
// Eenvoudige regex voor e-mail validatie
var pattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
return Regex.IsMatch(email, pattern);
}
}
```
**Stap 2: Middleware registreren in Startup.cs**
```csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<EmailValidationMiddleware>();
// Andere middleware
}
```
**Stap 3: Fouten afhandelen**
In de middleware stuur je een 400 Bad Request met een foutmelding als de validatie faalt. Je kunt de foutmelding aanpassen of meer gedetailleerd maken, bijvoorbeeld:
```csharp
await context.Response.WriteAsync(JsonSerializer.Serialize(new { error = "Ongeldig e-mailadres." }));
```
**Samenvatting:**
- Middleware leest de binnenkomende request body
- Parseert de JSON en checkt of het veld 'email' aanwezig en geldig is
- Bij invaliditeit, stuur je een 400 fout met een bericht
- Bij validiteit, ga je door naar de volgende middleware
Zo bouw je een eenvoudige validatiemiddleware die gecontroleert of een binnenkomend verzoek een geldig e-mailadres bevat.
provider: deepseek
model: deepseek-chat
Zeker! Ik zal u stap voor stap uitleggen hoe u een C# middleware bouwt voor e-mailvalidatie.
## 1. Basis Middleware Structuur
Eerst maakt u een middleware class:
```csharp
using Microsoft.AspNetCore.Http;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
public class EmailValidationMiddleware
{
private readonly RequestDelegate _next;
public EmailValidationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// Hier komt onze validatie logica
await _next(context);
}
}
```
## 2. Validatie Methoden
Voeg validatiemethoden toe aan de middleware:
```csharp
public class EmailValidationMiddleware
{
private readonly RequestDelegate _next;
public EmailValidationMiddleware(RequestDelegate next)
{
_next = next;
}
private bool IsValidEmail(string email)
{
if (string.IsNullOrWhiteSpace(email))
return false;
try
{
// Gebruik .NET's EmailAddressAttribute voor validatie
return new EmailAddressAttribute().IsValid(email);
}
catch
{
return false;
}
}
// Alternatieve methode met regex voor meer controle
private bool IsValidEmailRegex(string email)
{
if (string.IsNullOrWhiteSpace(email))
return false;
// Eenvoudige email regex pattern
string pattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
return Regex.IsMatch(email, pattern, RegexOptions.IgnoreCase);
}
}
```
## 3. Complete Middleware Implementatie
Hier is de complete middleware met foutafhandeling:
```csharp
using Microsoft.AspNetCore.Http;
using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using System.Threading.Tasks;
public class EmailValidationMiddleware
{
private readonly RequestDelegate _next;
public EmailValidationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// Alleen POST requests valideren (aanpasbaar naar behoefte)
if (context.Request.Method == "POST" &&
context.Request.ContentType != null &&
context.Request.ContentType.Contains("application/json"))
{
// Lees het request body
context.Request.EnableBuffering();
var requestBody = await new StreamReader(context.Request.Body).ReadToEndAsync();
context.Request.Body.Position = 0; // Reset de stream positie
if (!string.IsNullOrEmpty(requestBody))
{
try
{
// Parse JSON en zoek naar email velden
using var jsonDoc = JsonDocument.Parse(requestBody);
var isValid = ValidateEmailInJson(jsonDoc.RootElement);
if (!isValid)
{
await HandleValidationError(context, "Ongeldig e-mailadres");
return;
}
}
catch (JsonException)
{
await HandleValidationError(context, "Ongeldige JSON syntax");
return;
}
}
}
await _next(context);
}
private bool ValidateEmailInJson(JsonElement element)
{
switch (element.ValueKind)
{
case JsonValueKind.Object:
foreach (var property in element.EnumerateObject())
{
// Check op velden met 'email' in de naam
if (property.Name.ToLower().Contains("email") &&
property.Value.ValueKind == JsonValueKind.String)
{
var emailValue = property.Value.GetString();
if (!IsValidEmail(emailValue))
{
return false;
}
}
// Recursief door objecten heen zoeken
if (!ValidateEmailInJson(property.Value))
return false;
}
break;
case JsonValueKind.Array:
foreach (var item in element.EnumerateArray())
{
if (!ValidateEmailInJson(item))
return false;
}
break;
}
return true;
}
private bool IsValidEmail(string email)
{
if (string.IsNullOrWhiteSpace(email))
return false;
try
{
return new EmailAddressAttribute().IsValid(email);
}
catch
{
return false;
}
}
private async Task HandleValidationError(HttpContext context, string message)
{
context.Response.StatusCode = StatusCodes.Status400BadRequest;
context.Response.ContentType = "application/json";
var errorResponse = new
{
error = "Validatiefout",
message = message,
timestamp = DateTime.UtcNow
};
var jsonResponse = JsonSerializer.Serialize(errorResponse);
await context.Response.WriteAsync(jsonResponse);
}
}
```
## 4. Middleware Registreren
Registreer de middleware in uw `Program.cs` of `Startup.cs`:
**Program.cs (.NET 6+):**
```csharp
var builder = WebApplication.CreateBuilder(args);
// Voeg services toe
builder.Services.AddControllers();
var app = builder.Build();
// Gebruik de custom middleware
app.UseMiddleware<EmailValidationMiddleware>();
app.UseRouting();
app.UseAuthorization();
app.MapControllers();
app.Run();
```
**Startup.cs (oudere versies):**
```csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Andere middleware...
app.UseMiddleware<EmailValidationMiddleware>();
// Verdere configuratie...
}
```
## 5. Gebruik met DTOs (Aanbevolen)
Voor betere organisatie, gebruik Data Transfer Objects:
```csharp
public class UserRegistrationDto
{
public string Email { get; set; }
public string Username { get; set; }
}
// Aangepaste middleware versie voor specifieke DTOs
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Path.StartsWithSegments("/api/register") &&
context.Request.Method == "POST")
{
context.Request.EnableBuffering();
var requestBody = await new StreamReader(context.Request.Body).ReadToEndAsync();
context.Request.Body.Position = 0;
try
{
var registrationData = JsonSerializer.Deserialize<UserRegistrationDto>(requestBody);
if (registrationData != null && !IsValidEmail(registrationData.Email))
{
await HandleValidationError(context, "Ongeldig e-mailadres formaat");
return;
}
}
catch (JsonException)
{
await HandleValidationError(context, "Ongeldige JSON data");
return;
}
}
await _next(context);
}
```
## Belangrijke Kenmerken:
- **Flexibiliteit**: U kunt eenvoudig aanvullende validatieregels toevoegen
- **Foutafhandeling**: Duidelijke error responses met statuscode 400
- **Performance**: Gebruikt buffering om de request body te lezen
- **Uitbreidbaar**: Eenvoudig aan te passen voor andere validatietypes
Deze middleware onderschept alle inkomende requests en valideert e-mailadressen voordat de request uw controller bereikt!

