1

次のような複合オブジェクトを返す 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 に戻すと、問題が解決するのはなぜですか? どんな情報でも大歓迎です!:)

4

2 に答える 2

2

について奇妙なことは何も知りませんXmlDataDocumentが、必ずしも必要ではありませんXDocument-試してください:

XmlDocument newDoc = new XmlDocument();
newDoc.Load(new XmlNodeReader(doc.DocumentElement));
return newDoc.DocumentElement;

まだ理想的ではありませんが、私にはきれいに見えます...

于 2009-12-16T06:28:07.353 に答える
1

より多くのエラー情報を取得するには、サーバーの障害でデバッグの詳細を有効にする必要があります。現在表示されているメッセージは、基本的には、可能性のある攻撃者に対して何も明らかにしない一般的な WCF エラー メッセージです。言って: 何かがうまくいかなかった。

そのためには、サービス構成を微調整する必要があります - このセクションを追加します (まだ持っていない場合):

<behaviors>
  <serviceBehaviors>
    <behavior name="MEXandDebug">
      <serviceMetadata />
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

次に、サービス定義からそのセクションを参照します。

<services>
  <service behaviorConfiguration="MEXandDebug" name="WCFService.MyWCFService">

これにより、より意味のあるエラーが表示されるはずです。うまくいけば、何が問題なのかがわかります。

それ以外の場合は、サーバー側のコードをデバッグして、そこで何が起こっているかを調べる必要があります。

于 2009-12-16T06:21:44.817 に答える