WCF消耗多个可能的REST响应

时间:2009-07-06 15:37:21

标签: c# wcf rest webhttpbinding

我最近开始阅读有关WCF中的WebHttpBinding用法以及能够使用REST服务的内容,但是,我现在已经对这个问题感到困惑了。

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

例如,通用响应:

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

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

<ErrorResponse>
    <Message />
</ErrorResponse>

Pedram Rezaei在consuming REST services上发了一篇很棒的帖子,这是我借用大部分信息的地方。据我所知,只要对象具有已定义的可序列化属性,我们就可以创建一个对象。问题在于,没有条件要创建哪个类(ErrorResponse / ActualResponse)。

我不确定是否应该查看某种类型的TryParse功能,如果不能进行反序列化或者有更优雅的方法,它会发送初始请求并捕获错误。

我对WCF世界相当新,所以我可能会完全忽视某些东西!

1 个答案:

答案 0 :(得分:0)

我认为你可以借用SOAP的一些实践,它有一个像这样的层次结构:

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

我不是建议您使用SOAP,我建议您从SOAP使用的设计中学习。 SOAP所做的是在Body中嵌入成功(或在您的话语中“实际”)响应,在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封套中,然后反序列化 的结果。

如果你得到&lt; ActualResponse&gt; ...&lt; / ActualResponse&gt; ,将其包装在可反序列化的信封中,以获得类似&lt; ServiceResponse&gt;&lt; ActualResponse&gt; ...&lt; / ActualResponse&gt;&lt; / ServiceResponse&gt;,然后反序列化。