我有一个运行了一个多月的 SOAP 服务。在过去的两周中,我们遇到了服务将随机开始生成异常的情况。每次,它们似乎都与导出扩展有关,并且错误总是如下所示:
调用 WSDL 导出扩展时引发异常:System.ServiceModel.Description.DataContractSerializerOperationBehavior
使用“System.ArgumentException:命名节点来自不同的文档上下文。” 似乎每次都是根本原因。
让我烦恼的是,这项服务在一个半月内没有改变,所以我很困惑我们会多么突然地突然收到参数错误。这是否更能说明潜在问题(内存泄漏或类似问题)?
我对正在运行的机器的访问权限非常有限,但可以尝试根据需要获取任何支持信息。这是 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:自从询问初始查询以来,我发现客户端已将服务放在多个服务器上并且正在使用负载均衡器,我相信这可以解释我们得到的随机响应。我已经建议他们如何继续至少隔离问题并将从那里开始。