Home / Посібники / Інтеграція контактної форми ASP.NET Core (мінімальні API та Razor)
ПОСІБНИК З ІНТЕГРАЦІЇ · .NET & BACKEND

Інтеграція контактної форми ASP.NET Core (мінімальні API та Razor)

Безпечно пересилайте надсилання контактних форм із ASP.NET Core Minimal API або Razor Pages до Lugatu за допомогою IHttpClientFactory, ключів API на стороні сервера та автоматичних ключів ідемпотентності.

1. Мінімальна кінцева точка API з IHttpClientFactory

ASP.NET Core Minimal API забезпечує чистий, високопродуктивний спосіб отримувати надсилання контактних форм і безпечно пересилати їх до Lugatu за допомогою IHttpClientFactory та 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. Конфігурація в appsettings.json

Безпечно зберігайте свої облікові дані Lugatu за допомогою постачальників конфігурації ASP.NET Core. У виробництві використовуйте Azure Key Vault, AWS Secrets Manager або змінні середовища.

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

3. Реалізація контролера сторінок Razor

Для традиційних багатосторінкових програм ASP.NET Core MVC або Razor Pages пересилайте надсилання форм у OnPostAsync, скориставшись перевагами вбудованої перевірки маркерів ASP.NET Core Antiforgery.

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

Інваріант безпеки та автентифікації

Технічний інваріант: міжсерверні ключі API (lug_live_...) повинні зберігатися виключно на сервері. Зберігайте їх у appsettings.json або секретних сховищах; ніколи не передавати оперативні ключі клієнтським браузерам.

Усунення несправностей і поширені помилки передавання

HTTP 401 Неавторизована відповідь від Lugatu API

Переконайтеся, що ваш ключ API починається з lug_live_ і передається в заголовку Authorization: Bearer. Переконайтеся, що ключ API належить до робочої області, що містить ідентифікатор цільової форми.

Часті запитання

Чому я повинен використовувати IHttpClientFactory, а не створювати новий екземпляр HttpClient?

IHttpClientFactory керує об’єднанням сокетів і запобігає виснаженню сокетів під час великого навантаження в програмах ASP.NET Core.

Готові створити кінцеву точку форми?

Почніть безкоштовно за лічені секунди. Кредитна картка не потрібна.

Почніть безкоштовно →