WCF использует несколько возможных ответов REST

2

Недавно я начал читать о использовании WebHttpBinding в WCF и в состоянии использовать REST-сервисы, однако я немного пошатнулся на этом.

Я пишу службу, которая делает единственный запрос к данному api, однако может возвращать один из многих ответов.

Например, общий ответ:

<ActualResponse>
<ResponseItem>
    <Name />
    <Area />
</ResponseItem>
</ActualResponse>

Однако, если что-то было недопустимым в исходящем запросе, или сам отвечающий сервис испытывал какую-либо проблему, возвращающий ответ был бы следующим:

<ErrorResponse>
    <Message />
</ErrorResponse>

У Педрама Резайя была отличная статья на потребляющих сервисы REST, на которых я беру большую часть своей информации. Из того, что я могу сказать, мы можем создать объект, если объект имеет сериализуемые атрибуты. Проблема заключается в том, что нет никакого условия для создания класса (ErrorResponse/ActualResponse).

Я не уверен, что я должен смотреть на какую-то функцию TryParse, которая отправляет исходный запрос и ловит ошибку, если десериализация не может произойти или если есть более элегантный подход.

Я новичок в мире WCF, поэтому существует вероятность, что я могу полностью игнорировать что-то!

Теги:
rest
wcf

1 ответ

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

Я думаю, что вы можете позаимствовать некоторую практику из 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> , затем десериализовать.

Ещё вопросы

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