Home / Waelekezi / Muunganisho wa Fomu ya Mawasiliano ya ASP.NET (API Ndogo & Wembe)
MWONGOZO WA UTENGENEZAJI · .NET & BACKEND

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.

Program.cs csharp
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.

appsettings.json json
{
  "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.

Pages/Contact.cshtml.cs csharp
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

HTTP 401 Jibu lisiloidhinishwa kutoka kwa API ya Lugatu

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.

Anza Bure →