Integrasi Formulir Kontak Inti ASP.NET (API & Pisau Cukur Minimal)
Meneruskan pengiriman formulir kontak dengan aman dari ASP.NET Core Minimal API atau Razor Pages ke Lugatu menggunakan IHttpClientFactory, kunci API sisi server, dan kunci idempotensi otomatis.
1. Titik Akhir API Minimal dengan IHttpClientFactory
API Minimal Inti ASP.NET menyediakan cara yang bersih dan berkinerja tinggi untuk menerima pengiriman formulir kontak dan meneruskannya dengan aman ke Lugatu menggunakan IHttpClientFactory dan Kunci Idempotensi.
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. Konfigurasi di appsettings.json
Simpan kredensial Lugatu Anda dengan aman menggunakan penyedia konfigurasi ASP.NET Core. Dalam produksi, gunakan Azure Key Vault, AWS Secrets Manager, atau variabel lingkungan.
{
"Lugatu": {
"FormId": "YOUR_FORM_GUID",
"ApiKey": "lug_live_your_secret_server_key"
}
}
3. Implementasi Pengontrol Halaman Pisau Cukur
Untuk aplikasi ASP.NET Core MVC atau Razor Pages multi-halaman tradisional, teruskan pengiriman formulir dalam OnPostAsync sambil memanfaatkan verifikasi token Antiforgery bawaan 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();
}
}
Keamanan & Otentikasi Invarian
Invarian Teknis: Kunci API server-ke-server (lug_live_...) harus disimpan secara ketat di backend. Simpan di appsettings.json atau brankas rahasia; jangan pernah mengirimkan kunci langsung ke browser klien.
Pemecahan Masalah & Kesalahan Penyerapan Umum
Verifikasi bahwa kunci API Anda dimulai dengan lug_live_ dan diteruskan di header Otorisasi: Pembawa. Pastikan kunci API milik ruang kerja yang berisi ID formulir yang ditargetkan.
Pertanyaan yang Sering Diajukan
Mengapa saya harus menggunakan IHttpClientFactory daripada membuat instance HttpClient baru?
IHttpClientFactory mengelola pengumpulan soket dan mencegah kehabisan soket di bawah beban berat dalam aplikasi ASP.NET Core.
Siap membuat titik akhir formulir Anda?
Mulailah secara gratis dalam hitungan detik. Tidak diperlukan kartu kredit.