質問

最近、WCF での WebHttpBinding の使用方法と REST サービスを利用できることについて読み始めましたが、この点で少しつまずいています。

私は、特定の API に対して単一のリクエストを行うサービスを作成していますが、多くの応答のうちの 1 つを返すことができます。

たとえば、一般的な応答は次のようになります。

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

ただし、送信リクエストに無効な点があった場合、または応答するサービス自体に何らかの問題が発生した場合、返される応答は次のようになります。

<ErrorResponse>
    <Message />
</ErrorResponse>

Pedram Rezaei が素晴らしい投稿をしました RESTサービスの利用, 私の情報のほとんどはそこから借りています。私の知る限り、オブジェクトにシリアル化可能な属性が定義されている限り、オブジェクトを作成できます。問題は、どのクラスを作成するかという条件(ErrorResponse/ActualResponse)がないことです。

最初のリクエストを送信し、逆シリアル化が発生しない場合にエラーをキャッチする何らかの TryParse 機能を検討する必要があるのか​​、それともよりエレガントなアプローチがあるのか​​はわかりません。

私は WCF の世界にはあまり慣れていないので、何かを完全に見落としている可能性があります。

役に立ちましたか?

解決

SOAP から実践例を借用できると思います。SOAP には次のような階層があります。

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

私は SOAP を使用することを提案しているのではなく、SOAP で採用されている設計から学ぶことを提案しているのです。SOAP が行うことは、成功した (あなたの言葉で言えば「実際の」) レスポンスを Body 内に埋め込むことです。 または 返す 石鹸:故障 体の中で。

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