2

我最近开始阅读有关 WCF 中的 WebHttpBinding 用法并能够使用 REST 服务的信息,但是,我现在对这个有点困惑。

我正在编写一个向给定 api 发出单个请求的服务,但是,它可以返回许多响应中的一个。

例如,通用响应:

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

但是,如果传出请求中的某些内容无效或响应服务本身遇到任何问题,则返回响应将是:

<ErrorResponse>
    <Message />
</ErrorResponse>

Pedram Rezaei 有一篇关于消费 REST 服务的精彩帖子,我从那里借用了大部分信息。据我所知,只要对象定义了可序列化的属性,我们就可以创建一个对象。问题是,创建哪个类没有条件(ErrorResponse/ActualResponse)。

我不确定我是否应该查看某种 TryParse 功能,该功能发送初始请求并在无法发生反序​​列化或是否有更优雅的方法时捕获错误。

我对 WCF 世界还很陌生,所以我可能完全忽略了一些东西!

4

1 回答 1

0

我认为您可以从 SOAP 中借鉴一些实践,它的层次结构如下:

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

我不是建议您使用 SOAP,而是建议您学习 SOAP 所采用的设计。SOAP 所做的是将成功的(或用您的话称为“实际的”)响应嵌入到正文中,或者在正文中返回一个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 序列化在这方面确实很擅长。. .

但听起来你无法控制信封。事实上,您可以获得多个不同的响应。为了处理这个问题,您可以将收到的实际响应包装在一个人为的 XML 信封中,并反序列化.

如果您得到 <ActualResponse>...</ActualResponse> ,请将其包装在可反序列化的信封中以获得类似 <ServiceResponse><ActualResponse>...</ActualResponse></ServiceResponse> 的内容,然后反序列化。

于 2009-07-06T18:41:35.030 回答