Home / Guías / Integración de formulario de contacto de ASP.NET Core (API mínimas y Razor)
GUÍA DE INTEGRACIÓN · .NET Y BACKEND

Integración de formulario de contacto de ASP.NET Core (API mínimas y Razor)

Reenvíe envíos de formularios de contacto de forma segura desde ASP.NET Core Minimal API o Razor Pages a Lugatu mediante IHttpClientFactory, claves API del lado del servidor y claves de idempotencia automática.

1. Punto final API mínimo con IHttpClientFactory

Las API mínimas de ASP.NET Core proporcionan una forma limpia y de alto rendimiento de recibir envíos de formularios de contacto y reenviarlos de forma segura a Lugatu mediante IHttpClientFactory y una clave de Idempotencia.

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. Configuración en appsettings.json

Almacene sus credenciales de Lugatu de forma segura utilizando los proveedores de configuración de ASP.NET Core. En producción, utilice Azure Key Vault, AWS Secrets Manager o variables de entorno.

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

3. Implementación del controlador Razor Pages

Para aplicaciones tradicionales ASP.NET Core MVC o Razor Pages de varias páginas, reenvíe los envíos de formularios dentro de OnPostAsync mientras se beneficia de la verificación de token Antiforgery integrada de 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 de seguridad y autenticación

Invariante técnica: las claves API de servidor a servidor (lug_live_...) deben mantenerse estrictamente en el backend. Guárdelos en appsettings.json o bóvedas secretas; nunca transmita claves activas a los navegadores de los clientes.

Solución de problemas y errores comunes de ingesta

HTTP 401 Respuesta no autorizada de la API de Lugatu

Verifique que su clave API comience con lug_live_ y se pase en el encabezado Autorización: Portador. Asegúrese de que la clave API pertenezca al espacio de trabajo que contiene el ID del formulario de destino.

Preguntas frecuentes

¿Por qué debería utilizar IHttpClientFactory en lugar de crear una nueva instancia de HttpClient?

IHttpClientFactory administra la agrupación de sockets y evita el agotamiento de los sockets bajo cargas pesadas en aplicaciones ASP.NET Core.

¿Listo para crear el punto final de su formulario?

Comience gratis en segundos. No se requiere tarjeta de crédito.

Comience gratis →