在http参数中使用连字符的App Service

时间:2018-05-10 11:29:56

标签: asp.net-web-api asp.net-core aspnetboilerplate asp.net-boilerplate http-parameters

所以我们忙于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调用。有什么想法吗?

1 个答案:

答案 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等。