Служба приложений с дефисом в параметре 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
и т.п.