質問

現在の実装

xml型のMessageXmlという列を持つ、messagesというテーブルを持つSql Server 2005データベース。

XElement型のMessageXmlというフィールドを持つMessageというクラスを生成するLinq to Sqlクラスを持つC#ライブラリプロジェクト。

XElement型のMessageXmlというプロパティを持つMessagePayloadクラスを公開するWCF Webサービス。

Webサービスは、Linq to Sqlによって作成されたメッセージクラスを提供しません。軽量オブジェクトを中間に使用します。

質問

XElementは、実際にWCFサービスで使用したいタイプですか、それともより良いタイプですか。サービスに渡されるxmlは完全なドキュメントである必要があります。また、XMLドキュメントをXElementとして読み込むのに少し問題があります。サービスの軽量クラスで完全なxmlドキュメントタイプを公開する必要があると思いますが、XDocumentとXmlDocumentの違いについて少し混乱しています。

さらに、シリアル化できないXDeclaration型のプロパティが含まれているため、XDocument型のプロパティでWCF Messageクラスを公開できません。

XmlDocumentを使用する場合は、Linqクラスと軽量クラスの間の翻訳でxml型のこの奇妙な変換を行う必要があります。

 XmlDocument doc = new XmlDocument();
 doc.LoadXml(message.MessageXml.ToString());

 MessageEnvelope retVal = new MessageEnvelope()
 {
      MessageXml = doc,
 };

XmlDocumentは正しいもののようで、翻訳を行う必要があることはわかっていますが、可能な限り適切に近づけたいと考えています。

役に立ちましたか?

解決

XElementまたはXmlElementのいずれかを使用できます:

public XmlElement GetXmlElement()
{
    var doc = new XmlDocument();
    doc.Load(PREFIX + @"Enumerations.wsdl");

    return doc.DocumentElement;
}

public XElement GetXElement()
{
    var doc = XDocument.Load(PREFIX + @"Enumerations.wsdl");
    return doc.Root;
}

XDocument XmlDocument も必要ありません。返されるものはすべて、SOAPエンベロープを含むXMLドキュメントの中央にあることに注意してください。ドキュメント内にドキュメントを含めることはできないため、必要なのは要素です。

他のヒント

ジョン・サンダースはお金を稼いでいます。少し詳しく説明すると、 XmlElement または XElement を返すときに生成されるWSDLを見ると、次のように表示されます。

<xs:complexType>
  <xs:sequence>
    <xs:any minOccurs="0" processContents="lax"/>
  </xs:sequence>
</xs:complexType>

それだけです。これは基本的に、あらゆるXMLがここに移動できることを意味します。また、Chansikの提案に反して、戻り値の型を.NET固有の型にバインドしないことも意味します。

そのため、文字列を使用する必要はありません。

クラスをシリアル化するために必要な型を使用し(Stringは常にうまく機能します)、必要に応じてサーバーまたはクライアント側で変換を行い、ドキュメントの整合性を維持します。 1つ以上のXElementからXDocumentを構築することもできるので、XElementを使用します。

最悪の場合、クラスのシリアル化動作をオーバーライドすることもできます(リフレクションが得意であれば、それほどひどくはありません)。

XmlDocumentは古い、Linq以外のドキュメントです。それらは異なるクラスに実装された同じ概念です。

一般に、パフォーマンスの観点から、 Xml および XElememnt は、 XmlDocument および XmlElement よりも望ましいです。

ただし、次の理由により、 string を使用してWCFサービス経由でXMLドキュメントを送信することをお勧めします。

  1. 相互運用性
    • クライアントは特定の.NET Frameworkバージョンに関連付けられていません(クライアントは XDocument または XmlDocument の使用を選択できます。WCFサービスさえあれば、Javaベースのクライアントもサポートできます。そのように構成されています)。
  2. 元のXMLドキュメントにXml宣言が含まれている場合、Xml宣言を適切に処理します。

注:大規模なxmlドキュメントをサポートするには、構成を適切に調整してください。たとえば、 basicHttpBinding のデフォルトの最大メッセージサイズは64KBです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top