Home / Ръководства / Интеграция на ASP.NET Core Contact Form (Минимални API и Razor)
РЪКОВОДСТВО ЗА ИНТЕГРАЦИЯ · .NET & BACKEND

Интеграция на ASP.NET Core Contact Form (Минимални API и Razor)

Сигурно препращайте подаванията на формуляри за контакт от ASP.NET Core Minimal APIs или Razor Pages към Lugatu с помощта на IHttpClientFactory, API ключове от страна на сървъра и автоматични ключове за идемпотентност.

1. Минимална крайна точка на API с IHttpClientFactory

API на ASP.NET Core Minimal осигуряват чист, високоефективен начин за получаване на подавания на формуляри за контакт и безопасното им препращане към 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 Pages

За традиционни многостранични приложения ASP.NET Core MVC или Razor Pages, препращайте изпращания на формуляри в рамките на OnPostAsync, като същевременно се възползвате от вградената в 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();
    }
}

Инвариант на сигурността и удостоверяването

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

Отстраняване на неизправности и често срещани грешки при приемане

HTTP 401 Неоторизиран отговор от Lugatu API

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

Често задавани въпроси

Защо трябва да използвам IHttpClientFactory, вместо да създавам нов екземпляр на HttpClient?

IHttpClientFactory управлява групирането на сокети и предотвратява изтощаването на сокети при голямо натоварване в приложения на ASP.NET Core.

Готови ли сте да създадете вашата крайна точка на формуляр?

Започнете безплатно за секунди. Не се изисква кредитна карта.

Започнете безплатно →