首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

.NET 接收第三方平台推送數據:Webhook 實現指南

     編輯:程式設計綜合問答

場景描述

第三方平台通過 HTTP GET/POST 向我方配置的 backurl 推送數據(如 backurl?a=xx&c=xxx),包含實時與非實時數據。我方需建立接口接收並處理。

核心方案:ASP.NET Core Webhook 端點

1. 定義接收模型

public class PushDataDto
{
    public string A { get; set; }
    public string C { get; set; }
    // 其他字段...
    public DateTime ReceivedAt { get; set; } = DateTime.UtcNow;
}

2. Controller 實現

[ApiController]
[Route("api/webhook")]
public class WebhookController : ControllerBase
{
    private readonly ILogger<WebhookController> _logger;
    private readonly IMessageQueue _queue; // 推薦異步處理

    public WebhookController(ILogger<WebhookController> logger, IMessageQueue queue)
    {
        _logger = logger;
        _queue = queue;
    }

    [HttpGet("callback")]
    [HttpPost("callback")]
    public async Task<IActionResult> Receive([FromQuery] PushDataDto query, [FromBody] PushDataDto body)
    {
        var data = query ?? body; // 支持 GET 查詢字符串與 POST Body
        if (data == null) return BadRequest("Empty payload");

        _logger.LogInformation("收到推送: {@Data}", data);

        // 異步入隊,快速響應 200 OK
        await _queue.EnqueueAsync(data);

        return Ok(new { success = true, message = "Received" });
    }
}

3. 關鍵點解析

問題解決方案
實時/非實時混合統一入隊,消費端根據業務類型路由處理
高併發衝擊接口極簡邏輯(驗證+入隊),返回 200,異步消費
重複推送/幂等性基於唯一標識(如訂單號+時間戳)去重,Redis Set 或 DB 唯一索引
簽名驗證中間件驗證簽名(HMAC-SHA256),失敗返回 401
IP 白名單中間件或網關層限制來源 IP

4. 消費端示例

public class PushDataConsumer : BackgroundService
{
    private readonly IMessageQueue _queue;
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var data = await _queue.DequeueAsync(stoppingToken);
            try 
            {
                // 業務處理:入庫、發通知、觸發工作流...
                await ProcessBusinessAsync(data);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "處理推送失敗,重試機制...");
                // 重試/死信隊列
            }
        }
    }
}

替代方案:第三方消息網關

若不想自建服務,可用:

  • GoEasy:WebSocket/Polling 推送,提供 REST API,文檔完善。
  • Webhook.site / RequestBin:調試階段臨時接收。
  • 雲函數(AWS Lambda / Azure Functions / 阿里云函數計算):無服務器、按量付費、自動擴縮容。

總結

接收第三方推送核心是:**輕量級 Webhook 端點 + 異步消息隊列 + 幂等去重 + 安全驗證**。切勿在接口中同步處理耗時業務,導致第三方超時重試、數據堆積。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved