所以我们忙于ABP项目,并努力指定http参数映射到app服务参数。 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调用。有什么想法吗?
答案 0 :(得分: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
等。