Я относительно новичок в сервисах 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, а затем разобрать сообщение вручную. Однако это не кажется мне разумным/чистым решением.
Я был бы благодарен за любые альтернативы.
Возможно, это не лучший способ справиться с этим, но он работает.
У меня есть HTTP-модуль, который определяет, является ли входящий запрос подходящим методом службы, и если это так, преобразует заголовок ContentType из "application/json" в "text/plain".
Мой метод обслуживания принимает тело содержимого как параметр System.IO.Stream. Преобразуя поток в байт [], а затем в строку, я получаю необработанную строку JSON, отправленную EasyPost.
После этого просто нужно использовать Newtonsoft.Json, чтобы попытаться десериализовать строку JSON в ожидаемом типе.
Даже если десериализация не удалась, я все равно могу зарегистрировать данные и отправить ответ успешности вызывающему. Это достаточно хорошо для моих целей.