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.
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.
{
"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.
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
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.