0

WSTransfer の実装を作成しようとしています (Roman Kiss が既に WCF 用に作成していることは認識していますが、実際には仕様を満たしていません)。

WSTransfer は疎結合であるため、サービス コンタクトのデータ コントラクトを放棄することになりました。そのため、各作成メッセージは Message Create(Message request) のようになります。

これは問題なく動作し、応答を返すまではすべてがうまくいきます。

私が抱えている問題は、WSTransfer 応答が構築される方法にあります。create を例にとると、応答は次のようになります

<wxf:ResourceCreated>
  <wsa:Address>....</wsa:Address>
  <wsa:ReferenceProperties>
    <xxx:MyID>....</xxx:MyId>
  </wsa:ReferenceProperties>
</wxf:ResourceCreated>

ご覧のとおり、応答メッセージ内には 3 つの異なる XML 名前空間があります。

さて、関与するのは簡単です。(公開していなくても)、データ コントラクトを作成し、値を設定して、それを起動することができます

Message response = Message.CreateMessage(request.Version, 
            "http://schemas.xmlsoap.org/ws/2004/09/transfer/CreateResponse",
            resourceCreatedMessage);

ただし、応答内の子要素に異なる名前空間を設定すると問題が発生します。WCFのデータコントラクトはこれを行わないようです。使っても

[MessageBodyMember(Namespace="....")]

応答クラス内の個々の要素に変更が加えられていないように見える場合、すべてがコントラクト クラスに指定された名前空間の一部になります。

では、WCF メッセージ内の個々の要素に異なる名前空間を適用するにはどうすればよいですか。契約を介して、または他のジガリーポーカーを介して?

4

2 に答える 2

0

したがって、jezellの回答をフォローアップしてください。メッセージを手動で作成するときに XmlSerialization を使用する際の問題は、ルートの子要素の要素名が壊れてしまうことです。これは、手動でメッセージを作成するときに操作コントラクトが [XmlSerializerFormat] としてマークされているにもかかわらず、DataContractSerializer が使用されるために発生します。

XmlSerializer を Message.CreateMessage() に渡すことはできません。これは、XmlSerializer ではない XmlObjectSerializer を要求するためです。

したがって、答えは、XmlObjectSerializer を基本クラスとして持つ XmlSerializer のラッパー クラスを作成し (ここに例を示します)、それを渡すことのようです。メッセージ保持クラスと一緒に。

残念ながら、XML でプレフィックスをセットアップするのは賢明ではありません。そのため、次のようなメッセージが表示されます

<ResourceCreated xmlns="http://schemas.xmlsoap.org/ws/2004/09/transfer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/">http://localhost:8731/Design_Time_Addresses/AddTests/WSTransfer/</Address>
  <ReferenceType xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing/"></ReferenceType>

しかし、それはすべて同等です。

于 2008-11-06T16:42:00.700 に答える
0

このような場合、XML 出力を正確に制御する必要がある場合は、DataContract または MessageContract シリアル化の代わりに XmlSerializer を使用する必要があります。これを行う方法の詳細は次のとおりです。

http://msdn.microsoft.com/en-us/library/ms733901.aspx

于 2008-11-06T15:38:32.667 に答える