Недавно я начал читать о использовании WebHttpBinding в WCF и в состоянии использовать REST-сервисы, однако я немного пошатнулся на этом.
Я пишу службу, которая делает единственный запрос к данному api, однако может возвращать один из многих ответов.
Например, общий ответ:
<ActualResponse>
<ResponseItem>
<Name />
<Area />
</ResponseItem>
</ActualResponse>
Однако, если что-то было недопустимым в исходящем запросе, или сам отвечающий сервис испытывал какую-либо проблему, возвращающий ответ был бы следующим:
<ErrorResponse>
<Message />
</ErrorResponse>
У Педрама Резайя была отличная статья на потребляющих сервисы REST, на которых я беру большую часть своей информации. Из того, что я могу сказать, мы можем создать объект, если объект имеет сериализуемые атрибуты. Проблема заключается в том, что нет никакого условия для создания класса (ErrorResponse/ActualResponse).
Я не уверен, что я должен смотреть на какую-то функцию TryParse, которая отправляет исходный запрос и ловит ошибку, если десериализация не может произойти или если есть более элегантный подход.
Я новичок в мире WCF, поэтому существует вероятность, что я могу полностью игнорировать что-то!
Я думаю, что вы можете позаимствовать некоторую практику из SOAP, которая имеет такую иерархию:
<soap:Envelope>
<soap:Body>
... message contents
</soap:Body>
</soap:Envelope>
Я не предлагаю, чтобы вы использовали SOAP, я предлагаю вам ознакомиться с проектом, используемым SOAP. То, что делает SOAP, - это встраивание успешных (или ваших слов "фактических" ) ответов внутри тела или возврат soap: Fault в Body,
успех в SOAP может выглядеть следующим образом:
<soap:Envelope>
<soap:Body>
<ActualResponse>... </ActualResponse>
</soap:Body>
</soap:Envelope>
в то время как ошибка может выглядеть так:
<soap:Envelope>
<soap:Body>
<soap:Fault>... </soap:Fault>
</soap:Body>
</soap:Envelope>
В вашем случае у вас может быть следующее:
<ServiceResponse>
<ActualResponse> ... </ActualResponse>
</ServiceResponse>
или
<ServiceResponse>
<Fault> ... </Fault>
</ServiceResponse>
И XML Serialization действительно хороша в этом.,.
Но похоже, что у вас нет контроля над конвертом. Дело в том, что вы можете получить несколько разных ответов. Чтобы справиться с этим, вы можете обернуть фактический ответ, полученный в надуманном конверте XML, и десериализовать его результат.
Если вы получаете <ActualResponse> ... </ActualResponse> , оберните его в десериализуемый конверт, чтобы получить что-то вроде <ServiceResponse> <ActualResponse> ... </ActualResponse> </ServiceResponse> , затем десериализовать.