Home / 가이드 / ASP.NET Core 문의 양식 통합(최소 API 및 Razor)
통합 가이드 · .NET 및 백엔드

ASP.NET Core 문의 양식 통합(최소 API 및 Razor)

IHttpClientFactory, 서버 측 API 키 및 자동 멱등성 키를 사용하여 ASP.NET Core Minimal API 또는 Razor Pages에서 Lugatu로 문의 양식 제출을 안전하게 전달합니다.

1. IHttpClientFactory를 사용한 최소 API 엔드포인트

ASP.NET Core Minimal API는 문의 양식 제출을 수신하고 IHttpClientFactory 및 Idempotency-Key를 사용하여 Lugatu에 안전하게 전달하는 깔끔하고 고성능 방법을 제공합니다.

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. appsettings.json의 구성

ASP.NET Core 구성 공급자를 사용하여 Lugatu 자격 증명을 안전하게 저장하세요. 프로덕션에서는 Azure Key Vault, AWS Secrets Manager 또는 환경 변수를 활용합니다.

appsettings.json json
{
  "Lugatu": {
    "FormId": "YOUR_FORM_GUID",
    "ApiKey": "lug_live_your_secret_server_key"
  }
}

3. Razor Pages 컨트롤러 구현

기존 다중 페이지 ASP.NET Core MVC 또는 Razor Pages 앱의 경우 ASP.NET Core 기본 제공 Antiforgery 토큰 확인의 이점을 활용하면서 OnPostAsync 내에서 양식 제출을 전달하세요.

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();
    }
}

보안 및 인증 불변

기술적 불변: 서버 간 API 키(lug_live_...)는 백엔드에서 엄격하게 유지되어야 합니다. appsettings.json 또는 비밀 저장소에 저장하세요. 클라이언트 브라우저에 라이브 키를 전송하지 마십시오.

문제 해결 및 일반적인 수집 오류

Lugatu API의 HTTP 401 무단 응답

API 키가 lug_live_로 시작하고 Authorization: Bearer 헤더에 전달되는지 확인하세요. API 키가 대상 양식 ID가 포함된 작업공간에 속하는지 확인하세요.

자주 묻는 질문

새 HttpClient 인스턴스를 만드는 대신 IHttpClientFactory를 사용해야 하는 이유는 무엇입니까?

IHttpClientFactory는 소켓 풀링을 관리하고 ASP.NET Core 애플리케이션의 과부하로 인한 소켓 소모를 방지합니다.

양식 끝점을 만들 준비가 되셨나요?

몇 초 안에 무료로 시작해 보세요. 신용 카드가 필요하지 않습니다.

무료로 시작하세요 →