Home / Guide / Integrazione del modulo di contatto ASP.NET Core (API minime e Razor)
GUIDA ALL'INTEGRAZIONE · .NET E BACKEND

Integrazione del modulo di contatto ASP.NET Core (API minime e Razor)

Inoltra in modo sicuro gli invii di moduli di contatto dalle API ASP.NET Core Minimal o Razor Pages a Lugatu usando IHttpClientFactory, chiavi API lato server e chiavi di idempotency automatiche.

1. Endpoint API minimo con IHttpClientFactory

Le API ASP.NET Core Minimal forniscono un modo pulito e ad alte prestazioni per ricevere gli invii di moduli di contatto e inoltrarli in modo sicuro a Lugatu usando IHttpClientFactory e una chiave di idempotenza.

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. Configurazione in appsettings.json

Archiviare le credenziali Lugatu in modo sicuro usando i provider di configurazione ASP.NET Core. In produzione, utilizza Azure Key Vault, AWS Secrets Manager o variabili di ambiente.

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

3. Implementazione del controller delle pagine Razor

Per le tradizionali app ASP.NET Core MVC o Razor Pages multipagina tradizionali, inoltra gli invii di moduli all'interno di OnPostAsync beneficiando al contempo della verifica del token antifalsificazione incorporata di 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();
    }
}

Invariante di sicurezza e autenticazione

Invariante tecnica: le chiavi API server-to-server (lug_live_...) devono essere mantenute rigorosamente nel backend. Archiviali in appsettings.json o in depositi segreti; non trasmettere mai chiavi attive ai browser client.

Risoluzione dei problemi ed errori comuni di importazione

HTTP 401 Risposta non autorizzata dall'API Lugatu

Verifica che la tua chiave API inizi con lug_live_ e venga passata nell'intestazione Authorization: Bearer. Assicurati che la chiave API appartenga all'area di lavoro contenente l'ID del modulo di destinazione.

Domande frequenti

Perché dovrei utilizzare IHttpClientFactory anziché creare una nuova istanza HttpClient?

IHttpClientFactory gestisce il pool di socket e impedisce l'esaurimento dei socket in caso di carico intenso nelle applicazioni ASP.NET Core.

Pronto per creare l'endpoint del modulo?

Inizia gratuitamente in pochi secondi. Nessuna carta di credito richiesta.

Inizia gratis →