2

SOAP を介して Java クライアントに公開される Web サービスを開発する必要があります。両方のシステム間の通信に使用する適切に定義されたスキーマがあります。ここで、スキーマ オブジェクトを取得して DB 内に格納する操作を WCF コントラクトに公開する必要があります。

Webサービスを開発するために、次のことを行いました。

  • wcf で basichttp 経由でホストする
  • xsd.exe を使用してスキーマのオブジェクト モデルを作成する
  • DoThis(SchemaObject schema) のような操作のパラメーターとしてスキーマを取得します。

これは WCF で公開される予定なので、xsd ツールで生成されたオブジェクト モデルを変更しました。私たちのスキーマには複数レベルのネストがあり、4 つの異なるスキーマがリンクされています。xsd ツールで生成されたオブジェクト グラフには、抽象クラス、継承などがあります。

これを機能させるために、すべてのクラスで DataContract 属性を定義して定義し、XmlTypeAttribute に既に存在する名前空間をそれに追加しました。また、各プロパティに DataMemebers を追加しました。

スキーマ内の一部のプロパティは、xmlarrayitem 属性を使用してツールによって定義された配列です。

SOAP UI を使用してリクエストを送信すると、オブジェクトが期待どおりに逆シリアル化されません。ほとんどすべてのフィールドが null として送信されます。これには、ある種の継承階層があります。適切なデータ契約に KnownType 属性を追加しましたが、まだ機能していません。

私の質問は:

  • これは Web サービスを開発する正しい方法ですか。

  • datacontract と data members を配置することを避け、xsd ツールによって追加されたシリアライゼーション属性を操作する方法はありますか?

  • datacontract 属性を使用する必要がありますか? XML デシリアライゼーションの場合に機能するので、xmlserialization 属性では機能しませんか?

4

2 に答える 2

1

WCF は、 と の 2 種類のシリアル化をサポートしていDataContractSerializerますXmlSerializer

XSD.exe は、必要なすべてのXmlSerializer属性を持つ厳密な型のエンティティを生成します。WCF で生成されたクラスを操作するために、DataContractまたは属性を追加する必要はありません。DataMemeber

詳細については、MSDN を参照してください - http://msdn.microsoft.com/en-us/library/ms733901.aspx

xsd.exe によって生成されたエンティティにも十分注意してください。おそらくすでに見たように、WCF サーバーはこれらのファイルで実行できる多くのシリアル化の変更を使用しますが、クライアントは XSD でリレーされるため、クライアントの変更を破壊します。

可能であれば、インターフェイスが壊れていないことを保証するために、これらの自動生成されたエンティティを変更せずにそのままにしておきます。ビジネス層で使用するために個別の DTO クラスを導入できます。そこに継承階層を実装できます。

自動生成されたクラスを変更する必要があると思われる場合は、一連の単体テストが役立ちます。これらのテスト ケースは、さまざまなデータ セットを生成し、それらを XML にシリアル化し、その XML を XSD でチェックする必要があります。

于 2012-08-15T01:53:07.280 に答える
0

技術的には、サービスの実装方法に特に問題はありません。

しかし、アーキテクチャの観点からは、私には複雑すぎます。「フラットな」データ構造を送信し、複雑さを別の場所に隠す方が常に簡単です。次の手順をお勧めします

  1. 特別な「トランスポート」スキームを開発し、最大限にフラット化します。機種変更時のサービス変更が容易になります。また、xsd を生成して対処するのも楽になります。
  2. 通常のモデルを「フラット」に変換し、次にその逆に変換するために、チャネルの両側に特別な変換器をコーディングします。
于 2012-08-15T06:11:14.263 に答える