Integrácia základného kontaktného formulára ASP.NET (minimálne rozhrania API a Razor)
Posielajte odoslané kontaktné formuláre bezpečne z ASP.NET Core Minimal API alebo Razor Pages do Lugatu pomocou IHttpClientFactory, kľúčov API na strane servera a automatických kľúčov idempotencie.
1. Minimálny koncový bod API s IHttpClientFactory
ASP.NET Core Minimal API poskytujú čistý a vysokovýkonný spôsob prijímania odoslaných kontaktných formulárov a ich bezpečného posielania do Lugatu pomocou IHttpClientFactory a kľúča 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. Konfigurácia v súbore appsettings.json
Uložte svoje poverenia Lugatu bezpečne pomocou poskytovateľov konfigurácie ASP.NET Core. V produkcii používajte Azure Key Vault, AWS Secrets Manager alebo premenné prostredia.
{
"Lugatu": {
"FormId": "YOUR_FORM_GUID",
"ApiKey": "lug_live_your_secret_server_key"
}
}
3. Implementácia ovládača Razor Pages
V prípade tradičných viacstránkových aplikácií ASP.NET Core MVC alebo Razor Pages preposielajte odoslania formulárov v rámci OnPostAsync a zároveň využite výhody vstavaného overenia tokenov Antiforgery 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();
}
}
Bezpečnosť a nemenné overenie
Technický invariant: Kľúče API server-to-server (lug_live_...) musia byť prísne uložené na backende. Uložte ich do appsettings.json alebo tajných trezorov; nikdy neprenášajte živé kľúče do klientskych prehliadačov.
Riešenie problémov a bežné chyby príjmu
Overte, či váš kľúč API začína reťazcom lug_live_ a je odovzdaný v hlavičke Authorization: Bearer. Uistite sa, že kľúč API patrí do pracovného priestoru, ktorý obsahuje cieľové ID formulára.
Často kladené otázky
Prečo by som mal namiesto vytvárania novej inštancie HttpClient použiť IHttpClientFactory?
IHttpClientFactory spravuje združovanie soketov a zabraňuje vyčerpaniu soketov pri veľkom zaťažení v aplikáciách ASP.NET Core.
Ste pripravení vytvoriť koncový bod formulára?
Začnite zadarmo za pár sekúnd. Nevyžaduje sa žiadna kreditná karta.