Home / Ghiduri / Integrarea formularului de contact ASP.NET Core (API-uri minime și Razor)
GHID DE INTEGRARE · .NET & BACKEND

Integrarea formularului de contact ASP.NET Core (API-uri minime și Razor)

Redirecționați în siguranță trimiterile de formulare de contact de la ASP.NET Core Minimal API sau Razor Pages către Lugatu folosind IHttpClientFactory, chei API de pe server și chei automate de idempotence.

1. Punct final API minim cu IHttpClientFactory

API-urile ASP.NET Core Minimal oferă o modalitate curată și de înaltă performanță de a primi trimiteri de formulare de contact și de a le transmite în siguranță către Lugatu, folosind IHttpClientFactory și o cheie Idempotency.

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. Configurare în appsettings.json

Stocați-vă acreditările Lugatu în siguranță folosind furnizorii de configurare ASP.NET Core. În producție, utilizați Azure Key Vault, AWS Secrets Manager sau variabile de mediu.

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

3. Implementarea controlerului Razor Pages

Pentru aplicațiile tradiționale ASP.NET Core MVC sau Razor Pages cu mai multe pagini, redirecționați trimiterile de formulare în OnPostAsync, beneficiind în același timp de verificarea jetonului Antifalsificare ASP.NET Core încorporată.

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();
    }
}

Securitate și autentificare invariantă

Invariant tehnic: cheile API de la server la server (lug_live_...) trebuie păstrate strict pe backend. Stocați-le în appsettings.json sau în seifurile secrete; nu transmite niciodată chei live către browserele client.

Depanare și erori frecvente de ingestie

HTTP 401 Răspuns neautorizat de la API-ul Lugatu

Verificați dacă cheia dvs. API începe cu lug_live_ și este transmisă în antetul Autorizare: purtător. Asigurați-vă că cheia API aparține spațiului de lucru care conține ID-ul formularului vizat.

Întrebări frecvente

De ce ar trebui să folosesc IHttpClientFactory în loc să creez o nouă instanță HttpClient?

IHttpClientFactory gestionează poolingul de socket-uri și previne epuizarea socket-ului în condiții de sarcină mare în aplicațiile ASP.NET Core.

Sunteți gata să vă creați punctul final al formularului?

Începeți gratuit în câteva secunde. Nu este necesar un card de credit.

Începe gratuit →