Home / Guides / Intégration du formulaire de contact ASP.NET Core (API minimales et Razor)
GUIDE D'INTÉGRATION · .NET & BACKEND

Intégration du formulaire de contact ASP.NET Core (API minimales et Razor)

Transférez en toute sécurité les soumissions de formulaires de contact depuis les API ASP.NET Core Minimal ou Razor Pages vers Lugatu à l'aide d'IHttpClientFactory, de clés API côté serveur et de clés d'idempotence automatiques.

1. Point de terminaison API minimal avec IHttpClientFactory

Les API ASP.NET Core Minimal offrent un moyen propre et performant de recevoir des soumissions de formulaires de contact et de les transmettre en toute sécurité à Lugatu à l'aide de IHttpClientFactory et d'une clé d'idempotence.

Program.cs csharp
using System.Net.Http.Headers;
using System.Text.Json;

var builder = WebApplication.CreateBuilder(args);

// Register resilient Lugatu HTTP client
builder.Services.AddHttpClient("Lugatu", client =>
{
    client.BaseAddress = new Uri("https://www.lugatu.com");
    client.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("Bearer", builder.Configuration["Lugatu:ApiKey"]);
});

var app = builder.Build();

app.MapPost("/api/contact", async (ContactRequest request, IHttpClientFactory clientFactory, IConfiguration config) =>
{
    // 1. Silent rejection for automated bot traps
    if (!string.IsNullOrEmpty(request.Gotcha))
    {
        return Results.Ok(new { success = true });
    }

    var client = clientFactory.CreateClient("Lugatu");
    var formId = config["Lugatu:FormId"];

    var payload = new
    {
        fields = new Dictionary<string, string?>
        {
            ["name"] = request.Name,
            ["email"] = request.Email,
            ["message"] = request.Message,
        }
    };

    using var message = new HttpRequestMessage(HttpMethod.Post, $"/api/v1/forms/{formId}/submissions")
    {
        Content = new StringContent(JsonSerializer.Serialize(payload), System.Text.Encoding.UTF8, "application/json")
    };

    // Ensure at-most-once delivery with Idempotency-Key
    message.Headers.Add("Idempotency-Key", Guid.NewGuid().ToString());

    var response = await client.SendAsync(message);
    if (!response.IsSuccessStatusCode)
    {
        return Results.StatusCode((int)response.StatusCode);
    }

    return Results.Ok(new { success = true });
});

app.Run();

public record ContactRequest(string Name, string Email, string Message, string? Gotcha);

2. Configuration dans appsettings.json

Stockez vos informations d'identification Lugatu en toute sécurité à l'aide des fournisseurs de configuration ASP.NET Core. En production, utilisez Azure Key Vault, AWS Secrets Manager ou des variables d'environnement.

appsettings.json json
{
  "Lugatu": {
    "FormId": "YOUR_FORM_GUID",
    "ApiKey": "lug_live_your_secret_server_key"
  }
}

3. Implémentation du contrôleur Razor Pages

Pour les applications ASP.NET Core MVC ou Razor Pages traditionnelles multipages, transférez les soumissions de formulaires dans OnPostAsync tout en bénéficiant de la vérification des jetons Antiforgery intégrée à ASP.NET Core.

Pages/Contact.cshtml.cs csharp
public class ContactModel : PageModel
{
    private readonly IHttpClientFactory _clientFactory;
    private readonly string _formId;

    public ContactModel(IHttpClientFactory clientFactory, IConfiguration config)
    {
        _clientFactory = clientFactory;
        _formId = config["Lugatu:FormId"]!;
    }

    [BindProperty]
    public ContactInput Input { get; set; } = new();

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid || !string.IsNullOrEmpty(Input.Gotcha))
        {
            return Page();
        }

        var client = _clientFactory.CreateClient("Lugatu");
        var content = new StringContent(
            JsonSerializer.Serialize(new { fields = Input }),
            System.Text.Encoding.UTF8,
            "application/json");

        content.Headers.Add("Idempotency-Key", Guid.NewGuid().ToString());

        var res = await client.PostAsync($"/api/v1/forms/{_formId}/submissions", content);
        if (res.IsSuccessStatusCode)
        {
            return RedirectToPage("/ContactSuccess");
        }

        ModelState.AddModelError(string.Empty, "Unable to deliver inquiry. Please try again.");
        return Page();
    }
}

Invariant de sécurité et d'authentification

Invariant technique : les clés API de serveur à serveur (lug_live_...) doivent être conservées strictement sur le backend. Stockez-les dans appsettings.json ou dans des coffres-forts secrets ; ne transmettez jamais de clés en direct aux navigateurs clients.

Dépannage et erreurs d’ingestion courantes

HTTP 401 Réponse non autorisée de l'API Lugatu

Vérifiez que votre clé API commence par lug_live_ et est transmise dans l'en-tête Authorization: Bearer. Assurez-vous que la clé API appartient à l'espace de travail contenant l'ID de formulaire ciblé.

Foire aux questions

Pourquoi devrais-je utiliser IHttpClientFactory plutôt que de créer une nouvelle instance HttpClient ?

IHttpClientFactory gère le pool de sockets et empêche l'épuisement des sockets sous une charge importante dans les applications ASP.NET Core.

Prêt à créer votre point de terminaison de formulaire ?

Commencez gratuitement en quelques secondes. Aucune carte de crédit requise.

Commencez gratuitement →