یکپارچه سازی فرم تماس هسته ASP.NET (حداقل API و Razor)
فرم تماس ارسالی را به صورت ایمن از ASP.NET Core Minimal API یا Razor Pages به Lugatu با استفاده از IHttpClientFactory، کلیدهای API سمت سرور و کلیدهای idempotency خودکار ارسال کنید.
1. Minimal API Endpoint با IHttpClientFactory
ASP.NET Core Minimal API یک روش تمیز و با کارایی بالا برای دریافت فرم های ارسالی تماس و ارسال ایمن آنها به 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 به طور ایمن ذخیره کنید. در تولید، از Azure Key Vault، AWS Secrets Manager یا متغیرهای محیطی استفاده کنید.
{
"Lugatu": {
"FormId": "YOUR_FORM_GUID",
"ApiKey": "lug_live_your_secret_server_key"
}
}
3. پیاده سازی Razor Pages Controller
برای برنامههای سنتی چند صفحهای 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 متعلق به فضای کاری حاوی شناسه فرم مورد نظر است.
سوالات متداول
چرا باید به جای ایجاد یک نمونه جدید HttpClient از IHttpClientFactory استفاده کنم؟
IHttpClientFactory ادغام سوکت را مدیریت می کند و از فرسودگی سوکت تحت بار سنگین در برنامه های ASP.NET Core جلوگیری می کند.
برای ایجاد نقطه پایانی فرم خود آماده هستید؟
در عرض چند ثانیه به صورت رایگان شروع کنید. بدون نیاز به کارت اعتباری