集成指南·.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 应用程序,可以在 OnPostAsync 中转发表单提交,同时受益于 ASP.NET Core 内置的防伪令牌验证。
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 的工作区。
常见问题解答
为什么我应该使用 IHttpClientFactory 而不是创建新的 HttpClient 实例?
IHttpClientFactory 管理套接字池并防止 ASP.NET Core 应用程序中重负载下的套接字耗尽。
准备好创建您的表单端点了吗?
几秒钟内免费开始使用。 无需信用卡。