2009-07-06 5 views
2

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

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

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

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

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

<ErrorResponse> 
    <Message /> 
</ErrorResponse> 

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

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

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

ответ

0

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

<soap:Envelope> 
    <soap:Body> 
     ... message contents 
    </soap:Body> 
</soap:Envelope> 

Я не утверждаю, что вы используете SOAP, я предлагаю, чтобы вы научились от конструкции, используемой МЫЛО. То, что делает SOAP, - это встраивание успешных (или в ваших словах «фактических») ответов в Body, или, возвращать soap:Fault в Орган.

успех в 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 >, завернуть его в deserializable конверт, чтобы получить что-то вроде <ServiceResponse> <ActualResponse> ...</ActualResponse > </ServiceResponse >, затем десериализовать.

Смежные вопросы