10

私は今1ヶ月ちょっと実行されているSOAPサービスを持っています。過去2週間で、サービスがランダムに例外の生成を開始する状況が発生しました。毎回、それらはエクスポート拡張機能に関連しているようであり、エラーは常に次の行に沿っています。

WSDLエクスポート拡張機能の呼び出しで例外がスローされました:System.ServiceModel.Description.DataContractSerializerOperationBehavior

「System.ArgumentException:指定されたノードは別のドキュメントコンテキストからのものです。」毎回根本的な原因のようです。

私を悩ませているのは、このサービスが1か月半も変更されていないことです。そのため、突然引数エラーが発生するのではないかと混乱しています。これは根本的な問題(メモリリークなど)をよりよく示していますか?

これが実行されているマシンへのアクセスは非常に制限されていますが、必要に応じてサポート情報を取得することができます。wsdlが戻ってくる完全な例外は次のとおりです。

    An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
    System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior
     Endpoint: [endpoint name here... hidden for security] ----> System.ArgumentException: The named node is from a different document context.
       at System.Xml.XmlAttributeCollection.Append(XmlAttribute node)
       at System.ServiceModel.Description.SoapHelper.CreateSoapFaultBinding(String name, WsdlEndpointConversionContext endpointContext, FaultBinding wsdlFaultBinding, Boolean isEncoded)
       at System.ServiceModel.Description.MessageContractExporter.MessageBindingExporter.ExportMessageBinding(OperationDescription operation, Type messageContractExporterType)
       at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlEndpointConversionContext endpointContext, IWsdlExportExtension extension)
       --- End of inner ExceptionDetail stack trace ---
       at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata()
       at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized()
       at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension)
       at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData()
       at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleMetadataRequest(Message httpGetRequest, String[] queries, Message& replyMessage)
       at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest)
       at SyncInvokeGet(Object , Object[] , Object[] )
       at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
       at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
       at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

編集:サービスが常にこの例外に遭遇するとは限らないことを明確にしたかったのです。wsdlが正常に返される場合もあれば、この例外がスローされる場合もあります(現在、正常に返されるのは50/50ショットだと思います)。理由は頭も尻尾も作れません。私の最初の考えは環境問題ですが、そうだとすれば、ホスティングチームにどこを見ればよいかわかりません。

編集2:最初の問い合わせをしてから、クライアントがサービスを複数のサーバーに配置し、ロードバランサーを使用していることがわかりました。ロードバランサーは、取得したランダムな応答を説明していると思います。私は、少なくとも問題を切り分けて、そこから進む方法を彼らにアドバイスしました。

4

3 に答える 3

5

これと同様のエラーが発生しました。私の場合、WsdlExporter.GetGeneratedMetaData() へのインスタンス呼び出しはスレッド セーフではなく、Parallel.Foreach で呼び出されていたことが判明しました。そのため、単純なロックを追加すると問題が解決しました。

于 2012-05-01T10:37:40.830 に答える
2

そのエラーを見るだけではわかりにくいです。通信エラーのようには見えませんが、念のため、ボトルネックを作成する可能性があるため、シングルトンを使用していないことを確認してください。呼び出しごとがデフォルトの方法であり、ほとんどの状況で機能します。特に必要な場合にのみシングルトンを使用してくださいボトルネックを回避するためにロジックをラップします。

エラーがデータのシリアル化にあるようです。そのため、データ コントラクトとデータ メンバーが適切に定義されていることを確認し、プレーン オブジェクトの使用を避け、型付きオブジェクトを使用してください。データ メンバーをプロパティとして宣言する

これが役に立てば幸いです、セバスチャン

于 2011-05-16T20:48:11.257 に答える