2011-05-09 20 views
9

Tengo un servicio SOAP que se ha estado ejecutando durante poco más de un mes. En las últimas dos semanas hemos tenido situaciones en las que el servicio comenzará aleatoriamente a generar excepciones. Cada vez, que parece estar relacionada con la extensión de exportación, y el error es siempre a lo largo de las siguientes líneas:Excepción periódica en extensión de exportación WSDL

Se inició una excepción en una llamada a una extensión de exportación de WSDL: System.ServiceModel.Description.DataContractSerializerOperationBehavior

Con "System.ArgumentException: el nodo nombrado es de un contexto de documento diferente". que parece ser la causa raíz cada vez.

Lo que me molesta es que este servicio no ha cambiado en un mes y medio, así que estoy confundido de repente nos daríamos los errores de la discusión. ¿Esto es más indicativo de un problema subyacente (pérdida de memoria o similar)?

Tengo acceso muy limitado a la máquina en la que se está ejecutando, pero puedo tratar de obtener cualquier información de respaldo según sea necesario. Aquí está la excepción completa el WSDL vuelve con:

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) 

EDIT: Yo quería aclarar que el servicio no siempre se golpeó esta excepción. A veces el wsdl vuelve bien, otras veces arroja esta excepción (yo diría que actualmente es una oportunidad 50/50 de obtener un retorno exitoso). No puedo entender ni por qué. Mi pensamiento inicial se dirige a un problema ambiental, pero si ese es el caso, no tengo ni idea de dónde apuntar al equipo de alojamiento.

EDIT 2: Desde que realicé la consulta inicial, descubrí que el cliente ha puesto los servicios en varios servidores y está utilizando un equilibrador de carga, que, en mi opinión, representa las respuestas aleatorias que recibimos. Les aconsejé cómo proceder, al menos para aislar el problema y partir de allí.

Respuesta

2

Es difícil de decir con solo mirar ese error. no parece un error de comunicación, pero por si acaso, asegúrese de no estar usando singleton, ya que puede crear un cuello de botella, el método predeterminado es Per Call y funciona en la mayoría de las situaciones, use singleton solo si necesita específicamente y envuelva la lógica para evitar los cuellos de botella.

Parece que el error está serializando los datos, así que asegúrese de que sus Contratos de Datos y Miembros de Datos estén bien definidos, evite el uso de objetos simples, use objetos tipeados. Declarar miembros de datos como propiedades

Espero que esto ayude, Sebastián

+0

Gracias por la información, Sebastian. Desde que realicé la consulta inicial, descubrí que el cliente ha puesto los servicios en varios servidores y está utilizando un equilibrador de carga, que, en mi opinión, representa las respuestas aleatorias que recibimos. Les aconsejé cómo proceder, al menos para aislar el problema y partir de allí. ¡Gracias de nuevo! – Brian

5

tuve un error similar a este. En mi caso, resultó que una llamada de instancia a WsdlExporter.GetGeneratedMetaData() no era segura para subprocesos y se llamaba en un Paralelo.Foreach. Entonces, agregar un bloqueo simple resolvió el problema.

3

También estamos mordidos por esto, y en nuestro caso no estamos usando WsdlExporter ni nada por nuestra cuenta: esto sucede al OBTENER la URL WSDL, lo que causa un error HTTP 500. Una vez que ocurre el problema, sigue funcionando mal para nosotros. El problema desaparece al reciclar el grupo de aplicaciones.

Esto parece ser un error en algún lugar de la pila de Microsoft; ver https://connect.microsoft.com/VisualStudio/feedback/details/428531/wsdl-generation-error para un informe de error que está abierto en Microsoft Connect, que tiene la siguiente solución:

Agregue el código siguiente como primera cosa a ejecutar en cada ApplicationDomain que aloja los servicios de WCF:

var soapHelperType = typeof(System.ServiceModel.Description.IContractBehavior).Assembly.GetType("System.ServiceModel.Description.SoapHelper"); 
var documentProperty = soapHelperType.GetProperty("Document", 
BindingFlags.NonPublic | BindingFlags.Static); 
documentProperty.GetValue(null, null); 

(Dado que el producto que causa esto es mantenido por un equipo separado, no he podido intentar y verificar esta solución.)

Cuestiones relacionadas