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