WCF が複数の可能な REST 応答を消費する
-
23-08-2019 - |
質問
最近、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> のようなものを取得し、逆シリアル化します。