1

私は WCF を使用して、SOAP を介して非常に (非常に) 複雑な一連の対話 (コンピューターについて聞いたことがない人々によって管理されている委員会によって処理されています) を実装しています。次のようなメッセージが表示されます。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Header>
  ... (lots of "standard" stuff that noone has ever dared
       to cobble together in such non-standard ways before)
 </s:Header>
 <s:Body>
  <MyIncrediblyComplexXmlElement>
   ...
  </MyIncrediblyComplexXmlElement>
 </s:Body>
</s:Envelope>

xsd.exe...そして、本文のコンテンツをorによって作成されたオブジェクト モデルに解析したくありませんsvcutil.exe(これらのツールが、この特定の XML を正常にシリアル化/逆シリアル化できるオブジェクト モデルを生成できるかどうかは、活発な議論の問題です)。これらのサービスを実装するメッセージ コントラクトを作成する予定ですが、次のようなことができるかどうか疑問に思っています。

[ServiceContract(Namespace = "mynamespace")]
public interface IMyServiceInterface
{
 [OperationContract(Action = "requestaction", ReplyAction = "replyaction")]
 MyResponseMessage MyMethod(MyRequestMessage request);
}

[MessageContract(IsWrapped = false)]
public class MyRequestMessage
{
 [MessageBodyMember(Namespace = "mynamespace", Order = 0)]
 public XmlElement MyIncrediblyComplexXmlElement { get; set; }
}

[MessageContract(IsWrapped = false)]
public class MyResponseMessage
{
 [MessageBodyMember(Namespace = "mynamespace", Order = 0)]
 public XmlElement SomeResponseXmlElement { get; set; }
}

...そして、リクエストメッセージとレスポンスメッセージで出入りするXMLを直接操作します。これにより、開発が大幅に簡素化されます。これは、メッセージに表示される可能性のある XML の小さなサブセットのみを操作する必要があり、生成されたオブジェクト モデルが許容するよりも簡単に操作できるためです。

このパターン (XmlElementメッセージ コントラクトでの使用) は私の目的に適していますか? Messageそうでない場合、オブジェクトを直接操作することなく、XML を直接操作するという目標を達成するにはどうすればよいでしょうか?

4

2 に答える 2

1

XmlElementまたはXElementの操作が可能です。生成されたメッセージの説明にxsd:anyをWSDLに配置します。オブジェクトへのシリアル化と逆シリアル化を避けたい場合は、それが方法ですが、その場合、任意のXMLが到着する可能性があります。他の可能性はメッセージタイプを直接操作することですが、あなたはすでにそれを拒否しています。

于 2010-09-07T21:07:47.260 に答える
0

サーバーに送信される前、またはサーバー側で受信されるときに、メッセージ XML を操作するために、メッセージ インスペクターを作成し、それを WCF ランタイムにプラグインすることができます。

その他のヒントについては、 Message Inspectors に関する MSDN ドキュメント、または Pablo Pialorsi のブログ投稿を参照してください。物事は時々非常に厄介で毛むくじゃらになりますが、WCF ランタイムは確かに必要なフックを提供します。それはいい'n'簡単ですか?おそらくそうではありませんが、少なくともそれは可能であり、文書化された方法でも可能です!

于 2010-09-07T21:03:29.137 に答える