Muunganisho wa Fomu ya Mawasiliano ya ASP.NET (API Ndogo & Wembe)
Sambaza mawasilisho ya fomu ya mawasiliano kwa usalama kutoka kwa API za Msingi za ASP.NET au Kurasa za Kiwembe hadi Lugatu kwa kutumia IHttpClientFactory, funguo za API za upande wa seva, na vitufe otomatiki vya kujizuia.
1. Sehemu ya Mwisho ya API iliyo na IHttpClientFactory
API za Msingi za ASP.NET hutoa njia safi, yenye utendakazi wa hali ya juu ya kupokea mawasilisho ya fomu za mawasiliano na kuzisambaza kwa usalama kwa Lugatu kwa kutumia IHttpClientFactory na Ufunguo wa 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. Usanidi katika appsettings.json
Hifadhi kitambulisho chako cha Lugatu kwa usalama kwa kutumia watoa huduma za usanidi wa ASP.NET Core. Katika uzalishaji, tumia Vault ya Ufunguo wa Azure, Kidhibiti cha Siri za AWS, au anuwai za mazingira.
{
"Lugatu": {
"FormId": "YOUR_FORM_GUID",
"ApiKey": "lug_live_your_secret_server_key"
}
}
3. Utekelezaji wa Kidhibiti cha Kurasa za Wembe
Kwa programu za jadi za kurasa nyingi za ASP.NET Core MVC au Razor Pages, sambaza mawasilisho ya fomu ndani ya OnPostAsync huku ukinufaika na uthibitishaji wa tokeni ya ASP.NET Core iliyojengewa ndani ya Antiforgery.
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();
}
}
Tofauti ya Usalama na Uthibitishaji
Tofauti ya Kiufundi: Vifunguo vya API vya Seva-kwa-seva (lug_live_...) lazima viwekwe kwenye upande wa nyuma. Zihifadhi katika appsettings.json au vaults za siri; usiwahi kusambaza funguo za moja kwa moja kwa vivinjari vya mteja.
Utatuzi na Hitilafu za Kawaida za Kumeza
Thibitisha kuwa ufunguo wako wa API unaanza na lug_live_ na unapitishwa katika Kichwa cha Uidhinishaji: Kibeba. Hakikisha ufunguo wa API ni wa nafasi ya kazi iliyo na kitambulisho cha fomu inayolengwa.
Maswali Yanayoulizwa Mara Kwa Mara
Kwa nini nitumie IHttpClientFactory badala ya kuunda mfano mpya wa HttpClient?
IHttpClientFactory hudhibiti uunganishaji wa soketi na huzuia uchovu wa soketi chini ya mzigo mzito katika programu za ASP.NET Core.
Je, uko tayari kuunda mwisho wa fomu yako?
Anza bila malipo kwa sekunde chache. Hakuna kadi ya mkopo inahitajika.