Home / Guias / Integração de formulário de contato ASP.NET Core (APIs mínimas e Razor)
GUIA DE INTEGRAÇÃO · .NET E BACKEND

Integração de formulário de contato ASP.NET Core (APIs mínimas e Razor)

Encaminhe envios de formulários de contato com segurança de APIs ASP.NET Core Minimal ou Razor Pages para Lugatu usando IHttpClientFactory, chaves de API do lado do servidor e chaves de idempotência automáticas.

1. Endpoint mínimo da API com IHttpClientFactory

As APIs mínimas do ASP.NET Core fornecem uma maneira limpa e de alto desempenho de receber envios de formulários de contato e encaminhá-los com segurança para Lugatu usando IHttpClientFactory e uma Idempotency-Key.

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. Configuração em appsettings.json

Armazene suas credenciais Lugatu com segurança usando provedores de configuração do ASP.NET Core. Na produção, utilize o Azure Key Vault, o AWS Secrets Manager ou variáveis ​​de ambiente.

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

3. Implementação do controlador Razor Pages

Para aplicativos ASP.NET Core MVC ou Razor Pages tradicionais de várias páginas, encaminhe envios de formulários dentro do OnPostAsync enquanto se beneficia da verificação de token Antiforgery integrada do 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 segurança e autenticação

Invariante técnica: as chaves de API de servidor para servidor (lug_live_...) devem ser mantidas estritamente no backend. Armazene-os em appsettings.json ou em cofres secretos; nunca transmita chaves ativas para navegadores clientes.

Solução de problemas e erros comuns de ingestão

Resposta HTTP 401 não autorizada da API Lugatu

Verifique se sua chave de API começa com lug_live_ e é passada no cabeçalho Authorization: Bearer. Certifique-se de que a chave API pertence ao espaço de trabalho que contém o ID do formulário de destino.

Perguntas frequentes

Por que devo usar IHttpClientFactory em vez de criar uma nova instância de HttpClient?

IHttpClientFactory gerencia o pool de soquetes e evita o esgotamento de soquetes sob carga pesada em aplicativos ASP.NET Core.

Pronto para criar o endpoint do seu formulário?

Comece gratuitamente em segundos. Não é necessário cartão de crédito.

Comece grátis →