שילוב טופס יצירת קשר ליבה של ASP.NET (ממשקי API ותער מינימליים)
העבר את ההגשות של טופס יצירת קשר בצורה מאובטחת מממשקי API מינימליים של ASP.NET Core Minimal או דפי גילוח ל-Lugatu באמצעות IHttpClientFactory, מפתחות API בצד השרת ומפתחות אימפוטנציה אוטומטיים.
1. נקודת קצה מינימלית של API עם IHttpClientFactory
ממשקי API של ASP.NET Core Minimal מספקים דרך נקייה ובעלת ביצועים גבוהים לקבל הגשת טופס יצירת קשר ולהעביר אותם בצורה מאובטחת ל-Lugatu באמצעות IHttpClientFactory ומפתח 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. תצורה ב-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. יישום בקר דפי גילוח
עבור יישומי ASP.NET Core MVC או Razor Pages מסורתיים מרובי עמודים, העבר הגשת טפסים בתוך OnPostAsync תוך הנאה מאימות אסימון 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();
}
}
אבטחה ואימות בלתי משתנה
משתנה טכני: מפתחות API של שרת לשרת (lug_live_...) חייבים להישמר אך ורק בקצה האחורי. אחסן אותם בכספות appsettings.json או secrets; לעולם אל תשדר מפתחות חיים לדפדפני לקוח.
פתרון בעיות ושגיאות בליעה נפוצות
ודא שמפתח ה-API שלך מתחיל ב-lug_live_ ומועבר בכותרת Authorization: Bearer. ודא שמפתח ה-API שייך לסביבת העבודה המכילה את מזהה הטופס הממוקד.
שאלות נפוצות
מדוע עלי להשתמש ב-IHttpClientFactory במקום ליצור מופע HttpClient חדש?
IHttpClientFactory מנהלת איגום שקעים ומונעת מיצוי שקעים תחת עומס רב ביישומי ASP.NET Core.
מוכן ליצור את נקודת הקצה של הטופס שלך?
התחל בחינם תוך שניות. אין צורך בכרטיס אשראי.