Интеграция на ASP.NET Core Contact Form (Минимални API и Razor)
Сигурно препращайте подаванията на формуляри за контакт от ASP.NET Core Minimal APIs или Razor Pages към Lugatu с помощта на IHttpClientFactory, API ключове от страна на сървъра и автоматични ключове за идемпотентност.
1. Минимална крайна точка на API с IHttpClientFactory
API на ASP.NET Core Minimal осигуряват чист, високоефективен начин за получаване на подавания на формуляри за контакт и безопасното им препращане към Lugatu с помощта на IHttpClientFactory и 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. Конфигурация в appsettings.json
Съхранявайте вашите идентификационни данни за Lugatu сигурно, като използвате доставчици на конфигурация на ASP.NET Core. В производството използвайте Azure Key Vault, AWS Secrets Manager или променливи на средата.
{
"Lugatu": {
"FormId": "YOUR_FORM_GUID",
"ApiKey": "lug_live_your_secret_server_key"
}
}
3. Внедряване на контролера на Razor Pages
За традиционни многостранични приложения ASP.NET Core MVC или Razor Pages, препращайте изпращания на формуляри в рамките на OnPostAsync, като същевременно се възползвате от вградената в 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();
}
}
Инвариант на сигурността и удостоверяването
Технически инвариант: API ключовете от сървър към сървър (lug_live_...) трябва да се съхраняват стриктно в бекенда. Съхранявайте ги в appsettings.json или секретни хранилища; никога не предавайте активни ключове на клиентски браузъри.
Отстраняване на неизправности и често срещани грешки при приемане
Проверете дали вашият API ключ започва с lug_live_ и е предаден в заглавката Authorization: Bearer. Уверете се, че API ключът принадлежи към работното пространство, съдържащо целевия идентификатор на формуляр.
Често задавани въпроси
Защо трябва да използвам IHttpClientFactory, вместо да създавам нов екземпляр на HttpClient?
IHttpClientFactory управлява групирането на сокети и предотвратява изтощаването на сокети при голямо натоварване в приложения на ASP.NET Core.
Готови ли сте да създадете вашата крайна точка на формуляр?
Започнете безплатно за секунди. Не се изисква кредитна карта.