次のような複合オブジェクトを返す WCF Web サービスを構築しています。
[DataContract]
public class WebServiceReturn
{
...
[DataMember]
public XmlElement Results { get; set; }
...
}
次のコードで WebServiceReturn オブジェクトを返すと、すべて問題ありません。
XElement cities = new XElement("Cities",
from r in results
select new XElement("City", r));
using (XmlReader xmlReader = cities.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
WebServiceReturn response = new WebServiceReturn();
response.Results = xmlDoc.DocumentElement;
}
ただし、XmlDataDocument を返すストアド プロシージャ呼び出しの結果から XmlElement を取得する以下のコードを使用すると、CommunicationException がスローされます (内部例外はありません)。
XmlDataDocument xdd = DataAccess.ExecuteXML("MyStoredProc", parameter);
response.Results = xdd.DocumentElement;
紛らわしいのは、XmlDataDocument.DocumentElement (XmlElement) を XElement に変換してから XmlElement に戻す場合、問題はありません (うわー、一口でした)。したがって、次のコードは問題なく返されます。
XmlElement xe = DataAccess.ExecuteXML("MyStoredProc", parameter).DocumentElement;
XDocument xDoc = new XDocument();
using (XmlWriter xmlWriter = xDoc.CreateWriter()){
xe.WriteTo(xmlWriter);
}
using (XmlReader xmlReader = xDoc.Root.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
response.Results = xmlDoc.DocumentElement;
}
通信例外の詳細は次のとおりです。
[CommunicationException: サーバーは意味のある応答を提供しませんでした。これは、コントラクトの不一致、時期尚早のセッション シャットダウン、または内部サーバー エラーが原因である可能性があります。]
また、テスト アプリケーションのサービス リファレンスを複数回更新しましたが、効果はありませんでした。
Web サービスを呼び出しているテスト コードに問題がありますか? XmlElement を XElement に変換してから XmlElement に戻すと、問題が解決するのはなぜですか? どんな情報でも大歓迎です!:)