WSDL导出扩展中的周期性异常

Bri*_*ian 10 c# wsdl web-services exception invalidoperationexception

我有一个已经运行了一个多月的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)
Run Code Online (Sandbox Code Playgroud)

编辑:我想澄清该服务并不总是遇到这个例外.有时候wsdl会很好地回来,有时会抛出这个异常(我说目前这是50/50的成功回归).我不能为什么做出正面或反面.我最初的想法是环境问题,但如果是这样的话,我不知道在哪里指出托管团队的样子.

编辑2:自从询问初步调查以来,我发现客户端已经将服务放在多个服务器上,并且正在使用负载均衡器,我相信这是我们得到的随机响应的原因.我告诉他们如何进行至少隔离问题并将从那里开始.

小智 5

我有一个类似的错误.在我的例子中,事实证明,对WsdlExporter.GetGeneratedMetaData()的实例调用不是线程安全的,而是在Parallel.Foreach中调用.因此添加简单锁定解决了这个问题.


Seb*_*ldi 2

仅通过查看该错误很难判断。它看起来不像是通信错误,但为了以防万一,请确保您没有使用单例,因为可能会造成瓶颈,每次调用是默认方法,它适用于大多数情况,仅使用单例如果您特别需要它并包装逻辑以避免瓶颈。

\n\n

似乎错误在于序列化数据,因此请确保您的数据协定和数据成员定义良好,避免使用普通对象,而使用类型化对象。将数据成员声明为属性

\n\n

希望这有帮助,\n塞巴斯蒂安

\n