2008-09-25 48 views
7

Hemos consumido un servicio web de terceros y estamos intentando invocarlo desde una aplicación web ASP.NET. Sin embargo, cuando una instancia del servicio web se lanza la siguiente excepción System.InvalidOperationException:El método 'XYZ' no se puede reflejar

Método 'ABC.XYZ' no puede ser reflejada. System.InvalidOperationException: El método 'ABC.XYZ' no se puede reflejar. ---> System.InvalidOperationException: El elemento XML 'MyDoc' del espacio de nombres 'http://mysoftware.com/ns' hace referencia a un método y un tipo. Cambie el nombre del mensaje del método utilizando WebMethodAttribute o cambie el elemento raíz del tipo mediante el atributo XmlRootAttribute .

Por lo que puedo deducir, parece haber cierta ambigüedad entre un método y un tipo en el servicio web. ¿Alguien puede aclarar la causa probable de esta excepción y hay algo que pueda hacer para rectificar esto o debería ir a los propietarios del servicio web para rectificar?

Editar: Visual Studio 2008 ha creado la clase de proxy. Lamentablemente, no puedo proporcionar un enlace al wsdl, ya que es un servicio web para una aplicación de terceros localmente instalada.

Respuesta

3

Parece que el problema se debe a cuestiones de tipo de datos entre VS y el servicio web que fue escrito en Java .

En última instancia, se corrigió editando manualmente los archivos de clases y esquemas creados por VS.

+0

Marcó esto como respuesta, pero en realidad ¿olvidó mencionar cómo lo resolvió? – AaA

+2

@BobSort Lo siento, hace mucho tiempo para recordar exactamente lo que hice, pero hubiera sido en la línea de actualizar manualmente las clases de proxy que VS ha creado para acceder al servicio para usar los tipos de datos que esperaba. –

+0

En realidad, pude arreglarlo también, había una clase de propiedad generada con el mismo nombre que el método del servicio web. Cambié el nombre de la clase y se corrigió – AaA

1

Supongo que el wsdl emitido por o suministrado con el servicio no está en un formato que wsdl.exe o serviceutil pueda entender: ¿puede publicar el wsdl o un enlace al mismo?

¿cómo está creando las clases de proxy?

también que le gustaría tratar de validar el WSDL con el esquema WSDL para comprobar su validez

2

me he encontrado con el mismo problema cuando yo estaba consumiendo una tercera parte del servicio web. El problema en este caso era que la propiedad mustUndertand en el archivo de referencia buscaba un booleano, por lo que la propiedad del espacio de nombres buscaba una cadena.

Al mirar a través de la referencia, pude identificar la propiedad ofensiva y simplemente agregar "modificaciones" a la firma del método.

No es ideal ya que cada vez que actualiza el servicio tiene que hacer esto, pero no pude encontrar otra forma de evitar esto.

Para encontrar el archivo de referencia seleccione "Todos los archivos" desde el explorador de soluciones

Esperanza esto ayuda

0

Recibí el mismo mensaje, pero el mío fue causado por la falta de System.Runtime.Serialization.dll dado que traté de ejecutar una aplicación 3.5 en una máquina con solo .NET 2.0 instalado.

13

Me encontré con el mismo problema el día de hoy. La razón era que la clase generada por Visual Studio y pasada como parámetro en uno de los métodos no tenía un constructor sin parámetros predeterminado. Una vez que lo agregué, el error desapareció.

+0

Me salvaste horas ,,,, – PhillyNJ

+0

Y se restableció el equilibrio: perdí 5 horas antes de encontrar esta publicación – Braydie

1

En mi caso recibía un error del "método no se puede reflejar" debido a que en la clase devuelta por el método, no había podido exponer un constructor predeterminado sin parámetros.

Estaba trabajando en VB.NET. En mi clase de devolución, había declarado un método "Nuevo (...)" que tomaba un par de parámetros (porque así es como quería usarlo en mi código). Pero al hacerlo, había suprimido el constructor New() sin parámetros predeterminado (oculto) que VB agrega detrás de las escenas. Aparentemente, el controlador del servicio web requiere que esté disponible un constructor sin parámetros. Tan pronto como volví a agregar a mi clase un constructor sin parámetros de New(), todo funcionó bien.

0

Tuve el mismo problema pero encontré que uno de los parámetros WebMethod tiene un miembro que es del tipo interface por eso VS no pudo serializarlo. aquí es la excepción al intentar descargar el archivo disco

System.InvalidOperationException: No se puede serializar miembro de 'Leopard.JobDespatchParameters.SendingUser' del tipo 'Leopard.Interfaces.IUser', véase la excepción interna para más detalles . ---> System.NotSupportedException: No se puede serializar el miembro Leopard.JobDespatchParameters.SendingUser de tipo Leopard.Interfaces.IUser porque es una interfaz.

0

Tema viejo pero tuve un problema diferente, Quizás de ayuda para alguien. dlls referenciados se mezclaron entre dos versiones en la capa de datos y la capa de servicio que causó el problema.

0

Otro escenario donde puede ocurrir este error: simplemente tenía otro método web con el mismo nombre (pero diferentes parámetros) en mi servicio web que se deslizó durante una fusión de código. Después de eliminar el viejo método, funcionó.

Cuestiones relacionadas