Webサービスに適したXMLタイプは何ですか?
-
06-07-2019 - |
質問
現在の実装
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ドキュメントを送信することをお勧めします。
- 相互運用性
- クライアントは特定の.NET Frameworkバージョンに関連付けられていません(クライアントは
XDocument
またはXmlDocument
の使用を選択できます。WCFサービスさえあれば、Javaベースのクライアントもサポートできます。そのように構成されています)。
- クライアントは特定の.NET Frameworkバージョンに関連付けられていません(クライアントは
- 元のXMLドキュメントにXml宣言が含まれている場合、Xml宣言を適切に処理します。
注:大規模なxmlドキュメントをサポートするには、構成を適切に調整してください。たとえば、 basicHttpBinding
のデフォルトの最大メッセージサイズは64KBです。