Home / Hướng dẫn / Tích hợp biểu mẫu liên hệ ASP.NET Core (API & dao cạo tối thiểu)
HƯỚNG DẪN TÍCH HỢP · .NET & BACKEND

Tích hợp biểu mẫu liên hệ ASP.NET Core (API & dao cạo tối thiểu)

Chuyển tiếp việc gửi biểu mẫu liên hệ một cách an toàn từ API ASP.NET Core Minimal hoặc Razor Pages tới Lugatu bằng cách sử dụng IHttpClientFactory, khóa API phía máy chủ và khóa idempotency tự động.

1. Điểm cuối API tối thiểu với IHttpClientFactory

API tối thiểu của ASP.NET Core cung cấp một cách rõ ràng, hiệu suất cao để nhận các lượt gửi biểu mẫu liên hệ và chuyển tiếp chúng một cách an toàn đến Lugatu bằng cách sử dụng IHttpClientFactory và 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. Cấu hình trong appsinstall.json

Lưu trữ thông tin xác thực Lugatu của bạn một cách an toàn bằng cách sử dụng các nhà cung cấp cấu hình ASP.NET Core. Trong quá trình sản xuất, hãy sử dụng Azure Key Vault, AWS Secrets Manager hoặc các biến môi trường.

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

3. Triển khai bộ điều khiển trang Razor

Đối với các ứng dụng ASP.NET Core MVC hoặc Razor Pages nhiều trang truyền thống, hãy chuyển tiếp việc gửi biểu mẫu trong OnPostAsync đồng thời hưởng lợi từ xác minh mã thông báo Antiforgery tích hợp sẵn của 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();
    }
}

Bảo mật & xác thực bất biến

Bất biến kỹ thuật: Khóa API máy chủ đến máy chủ (lug_live_...) phải được lưu giữ nghiêm ngặt ở phần phụ trợ. Lưu trữ chúng trong appsinstall.json hoặc kho bí mật; không bao giờ truyền khóa trực tiếp tới trình duyệt máy khách.

Khắc phục sự cố và các lỗi nhập thường gặp

Phản hồi HTTP 401 trái phép từ API Lugatu

Xác minh rằng khóa API của bạn bắt đầu bằng lug_live_ và được chuyển trong tiêu đề Authorization: Bearer. Đảm bảo khóa API thuộc về không gian làm việc chứa ID biểu mẫu được nhắm mục tiêu.

Câu hỏi thường gặp

Tại sao tôi nên sử dụng IHttpClientFactory thay vì tạo phiên bản HttpClient mới?

IHttpClientFactory quản lý việc tổng hợp ổ cắm và ngăn chặn tình trạng cạn kiệt ổ cắm khi tải nặng trong các ứng dụng ASP.NET Core.

Bạn đã sẵn sàng tạo điểm cuối biểu mẫu chưa?

Bắt đầu miễn phí trong vài giây. Không cần thẻ tín dụng.

Bắt đầu miễn phí →