Вопрос

Недавно я начал читать об использовании 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>, а затем десериализуйте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top