WCF использует несколько возможных ответов REST
-
23-08-2019 - |
Вопрос
Недавно я начал читать об использовании 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 может выглядеть так:
<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 действительно хороша в этом...
Но похоже, что вы не можете контролировать конверт.Дело в том, что вы можете получить несколько разных ответов.Чтобы справиться с этим, вы можете обернуть фактический полученный ответ в надуманный конверт XML и десериализовать результат что.
Если вы получили <ActualResponse>...</ActualResponse> , заключите его в десериализуемый конверт, чтобы получить что-то вроде <ServiceResponse><ActualResponse>...</ActualResponse></ServiceResponse>, а затем десериализуйте.