0

因此,我们正忙于一个 ABP 项目,并努力指定 http 参数以映射到应用服务参数。Mailgun 的 Webhook 使用“Message-Id”作为 http 参数,我们正在努力从应用服务访问它。

这是我们的应用服务:

    public async Task MailDelivered(int timestamp, string token, string signature, string MessageId)
    {
        var isValid = IsMailGunSignatureValid(timestamp, token, signature);
        if (isValid)
        {
            Console.WriteLine($"Message id: {MessageId}");
            var entity = await communicationEventRepository.FirstOrDefaultAsync(entry => entry.MessageId == $"{MessageId}");
            if (entity != null)
            {
                var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
                entity.DeliveredTime = unixEpoch.AddSeconds(timestamp);
                await communicationEventRepository.UpdateAsync(entity);
            }
            else
            {
                throw new UserFriendlyException("Invalid message-id.");
            }
        }
        else
        {
            throw new UserFriendlyException("Invalid signature.");
        }
    }

但是,我们得到了 MessageId 的空白字符串。由于 C# 命名规则,我们无法命名函数参数 Message-Id。我们也无法从 POST 正文中获取 JSON 格式的数据,因为 Mailgun 仅支持 x-www-form-urlencoded 的 webhook 调用。有任何想法吗?

4

1 回答 1

0

您可以使用类作为参数并使用BindProperty属性来更改message-id.

例如:

public class MailDeliveredRequest
{
    public int Timestamp { get; set; }
    public string Token { get;set; }
    public string Signature { get;set; }

    [BindProperty(Name="Message-Id")]
    public string MessageId { get;set; }
}

然后更改您的方法声明:

public async Task MailDelivered(MailDeliveredRequest msg)
{
....
}

您的所有查询字符串值都可以使用msg变量访问,例如msg.MessageId等。

于 2018-05-10T14:01:17.637 回答