การรวมแบบฟอร์มการติดต่อ ASP.NET Core (API และมีดโกนขั้นต่ำ)
ส่งต่อการส่งแบบฟอร์มการติดต่ออย่างปลอดภัยจาก ASP.NET Core Minimal API หรือ Razor Pages ไปยัง Lugatu โดยใช้ IHttpClientFactory, คีย์ API ฝั่งเซิร์ฟเวอร์ และคีย์ idempotency อัตโนมัติ
1. จุดสิ้นสุด API ขั้นต่ำด้วย 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 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 พร้อมรับประโยชน์จากการตรวจสอบโทเค็น 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 หรือห้องนิรภัย อย่าส่งคีย์สดไปยังเบราว์เซอร์ไคลเอ็นต์
การแก้ไขปัญหาและข้อผิดพลาดในการนำเข้าทั่วไป
ตรวจสอบว่าคีย์ API ของคุณขึ้นต้นด้วย lug_live_ และส่งผ่านในส่วนหัว Authorization: Bearer ตรวจสอบให้แน่ใจว่าคีย์ API เป็นของพื้นที่ทำงานที่มี ID แบบฟอร์มเป้าหมาย
คำถามที่พบบ่อย
เหตุใดฉันจึงควรใช้ IHttpClientFactory แทนที่จะสร้างอินสแตนซ์ HttpClient ใหม่
IHttpClientFactory จัดการการรวมซ็อกเก็ตและป้องกันการหมดซ็อกเก็ตภายใต้ภาระหนักในแอปพลิเคชัน ASP.NET Core
พร้อมที่จะสร้างจุดสิ้นสุดของแบบฟอร์มแล้วหรือยัง?
เริ่มต้นฟรีในไม่กี่วินาที ไม่ต้องใช้บัตรเครดิต