Служба приложений с дефисом в параметре http

Поэтому мы заняты проектом ABP и пытаемся указать параметр http для сопоставления с параметром службы приложения. Webhook от Mailgun использует "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. Мы не можем назвать параметр функции Message-Id из-за правил именования в C#. Мы также не можем получить данные из тела POST в виде JSON, поскольку Mailgun поддерживает только x-www-form-urlencoded для своих вызовов webhook. Есть идеи?

1 ответ

Вы можете использовать класс для параметров и использовать 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 и т.п.