Служба приложений с дефисом в параметре 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 для вызовов веб-перехватчика. Любые идеи?




Ответы (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 и т.д.

person Simply Ged    schedule 10.05.2018
comment
Во-первых, это изменяет службу приложения, чтобы она принимала только тело json (я получаю 415 неподдерживаемый тип мультимедиа при использовании ввода формы), а во-вторых, он даже фактически не сопоставляется с Message-Id при отправке тела json. - person ryan27968; 11.05.2018
comment
Я протестировал его с помощью почтальона, используя типы x-www-form-urlencoded и formdata, и веб-приложение каждый раз правильно получало данные. Можете ли вы добавить пример данных, отправляемых в веб-приложение? Я также предполагаю, что это HttpPost? - person Simply Ged; 11.05.2018