Integrarea formularului de contact ASP.NET Core (API-uri minime și Razor)
Redirecționați în siguranță trimiterile de formulare de contact de la ASP.NET Core Minimal API sau Razor Pages către Lugatu folosind IHttpClientFactory, chei API de pe server și chei automate de idempotence.
1. Punct final API minim cu IHttpClientFactory
API-urile ASP.NET Core Minimal oferă o modalitate curată și de înaltă performanță de a primi trimiteri de formulare de contact și de a le transmite în siguranță către Lugatu, folosind IHttpClientFactory și o cheie Idempotency.
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. Configurare în appsettings.json
Stocați-vă acreditările Lugatu în siguranță folosind furnizorii de configurare ASP.NET Core. În producție, utilizați Azure Key Vault, AWS Secrets Manager sau variabile de mediu.
{
"Lugatu": {
"FormId": "YOUR_FORM_GUID",
"ApiKey": "lug_live_your_secret_server_key"
}
}
3. Implementarea controlerului Razor Pages
Pentru aplicațiile tradiționale ASP.NET Core MVC sau Razor Pages cu mai multe pagini, redirecționați trimiterile de formulare în OnPostAsync, beneficiind în același timp de verificarea jetonului Antifalsificare ASP.NET Core încorporată.
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();
}
}
Securitate și autentificare invariantă
Invariant tehnic: cheile API de la server la server (lug_live_...) trebuie păstrate strict pe backend. Stocați-le în appsettings.json sau în seifurile secrete; nu transmite niciodată chei live către browserele client.
Depanare și erori frecvente de ingestie
Verificați dacă cheia dvs. API începe cu lug_live_ și este transmisă în antetul Autorizare: purtător. Asigurați-vă că cheia API aparține spațiului de lucru care conține ID-ul formularului vizat.
Întrebări frecvente
De ce ar trebui să folosesc IHttpClientFactory în loc să creez o nouă instanță HttpClient?
IHttpClientFactory gestionează poolingul de socket-uri și previne epuizarea socket-ului în condiții de sarcină mare în aplicațiile ASP.NET Core.
Sunteți gata să vă creați punctul final al formularului?
Începeți gratuit în câteva secunde. Nu este necesar un card de credit.