Могут ли непредсказуемо типизированные аргументы обрабатываться в службе WCF?

1

Я относительно новичок в сервисах WCF, поэтому заранее прошу прощения, если я пропущу очевидное. Мой бизнес использует EasyPost в качестве нашего решения для доставки, и я написал службу WCF для обработки вызовов webhook статуса доставки из EasyPost, описанных здесь: https://www.easypost.com/docs/webhooks

Вкратце, EasyPost отправляет объект обновления как JSON через POST. Проблема в том, что он отправляет несколько разных типов (неконфигурируемых) обновлений для одного и того же метода службы, и мне трудно писать DataContract, который охватывает все возможности. Например, если отправленный аргумент является обновлением номера отслеживания, update.result.status будет строковым значением; если это обновление состояния пакета, update.result.status будет объектом. Это немного беспорядок.

Я попробовал обработать только тип обновления, который мне волнует, и вернуть код статуса 400 другим, но EasyPost интерпретирует это как отключение и отбрасывает мой сервис в качестве конечной точки webhook.

Из того, что я прочитал, похоже, что я мог отказаться от удобства Контракта данных в пользу использования параметра System.ServiceModel.Channels.Message как объекта catch-all, а затем разобрать сообщение вручную. Однако это не кажется мне разумным/чистым решением.

Я был бы благодарен за любые альтернативы.

Теги:
generics
wcf
easypost
parametric-polymorphism

1 ответ

1
Лучший ответ

Возможно, это не лучший способ справиться с этим, но он работает.

У меня есть HTTP-модуль, который определяет, является ли входящий запрос подходящим методом службы, и если это так, преобразует заголовок ContentType из "application/json" в "text/plain".

Мой метод обслуживания принимает тело содержимого как параметр System.IO.Stream. Преобразуя поток в байт [], а затем в строку, я получаю необработанную строку JSON, отправленную EasyPost.

После этого просто нужно использовать Newtonsoft.Json, чтобы попытаться десериализовать строку JSON в ожидаемом типе.

Даже если десериализация не удалась, я все равно могу зарегистрировать данные и отправить ответ успешности вызывающему. Это достаточно хорошо для моих целей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню