ASP.NET Core Contact Form Integration (Minimal na mga API at Razor)
Ligtas na ipasa ang mga pagsusumite ng contact form mula sa ASP.NET Core Minimal API o Razor Pages sa Lugatu gamit ang IHttpClientFactory, mga server-side na API key, at mga awtomatikong idempotency key.
1. Minimal na API Endpoint sa IHttpClientFactory
Ang ASP.NET Core Minimal API ay nagbibigay ng malinis, mataas na pagganap na paraan upang makatanggap ng mga pagsusumite ng contact form at secure na ipasa ang mga ito sa Lugatu gamit ang IHttpClientFactory at isang 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. Configuration sa appsettings.json
Ligtas na iimbak ang iyong mga kredensyal sa Lugatu gamit ang mga provider ng pagsasaayos ng ASP.NET Core. Sa produksyon, gamitin ang Azure Key Vault, AWS Secrets Manager, o mga variable ng kapaligiran.
{
"Lugatu": {
"FormId": "YOUR_FORM_GUID",
"ApiKey": "lug_live_your_secret_server_key"
}
}
3. Pagpapatupad ng Controller ng Razor Pages
Para sa tradisyunal na multi-page na ASP.NET Core MVC o Razor Pages na apps, ipasa ang mga pagsusumite ng form sa loob ng OnPostAsync habang nakikinabang mula sa ASP.NET Core built-in na Antiforgery token verification.
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();
}
}
Invariant ng Seguridad at Pagpapatotoo
Teknikal na Invariant: Ang mga server-to-server na API key (lug_live_...) ay dapat na panatilihing mahigpit sa backend. I-store ang mga ito sa appettings.json o secrets vaults; hindi kailanman magpadala ng mga live na key sa mga browser ng kliyente.
Pag-troubleshoot at Mga Karaniwang Error sa Pag-ingest
I-verify na ang iyong API key ay nagsisimula sa lug_live_ at ipinasa sa Authorization: Bearer header. Tiyaking nabibilang ang API key sa workspace na naglalaman ng target na form ID.
Mga Madalas Itanong
Bakit ko dapat gamitin ang IHttpClientFactory sa halip na lumikha ng isang bagong halimbawa ng HttpClient?
Ang IHttpClientFactory ay namamahala sa socket pooling at pinipigilan ang socket exhaustion sa ilalim ng mabigat na pagkarga sa mga aplikasyon ng ASP.NET Core.
Handa nang gawin ang endpoint ng iyong form?
Magsimula nang libre sa ilang segundo. Walang kinakailangang credit card.