2012-08-14 17 views
7

Tengo un servicio web y un cliente. Las clases utilizadas en los parámetros y los tipos de devolución están en una DLL común compartida por ambos. Sin embargo, cada vez que actualizo la referencia web, Visual Studio genera copias de las clases con los mismos nombres y propiedades y métodos públicos. Entonces, la solución no se compilará porque el código del cliente intenta usar las versiones en la DLL común. Puedo resolver el problema eliminando las clases "duplicadas" cada vez que actualizo la referencia web, y agrego una instrucción using para señalar el espacio de nombres del dll común. ¿Hay alguna manera de solucionar esto de forma permanente?Impedir la generación de clases proxy en Reference.cs al agregar/actualizar una referencia web

ACTUALIZACIÓN: Ver mis comentarios a continuación. Esta es una "característica" de los servicios web de asmx. No hay forma de evitarlo que no sea uno de los siguientes: 1) Use un tipo de servicio web más moderno. 2) No utilice una DLL común 3) Solucione manualmente cada vez que actualice la referencia web, como en la pregunta original anterior.

+1

Según esta pregunta similar http://stackoverflow.com/questions/134064/reuse-existing-types-is-ignored-when-adding-a-service-reference, "Tipos de reutilización" no es compatible con "old escuela "(asmx) referencias web. – stannius

+0

http://stackoverflow.com/questions/3389679/how-does-visual-studio-2008-and-svcutil-decide-which-types-to-re-use-from-refere – stannius

+0

Deberías añadir tu comentario como un responder. Yo luego votaría. –

Respuesta

2

Esta es una "característica" de los servicios web de asmx. No hay forma de evitarlo que no sea uno de los siguientes:

  • Utilice un tipo más moderno de servicio web.
  • No utilice una DLL común
  • Corrija manualmente cada vez que actualice la referencia web, como en la pregunta original anterior.

Fuentes: Otras preguntas stackoverflow:

0

No hay forma de hacerlo.

Sin embargo, creo que tenemos un problema de diseño aquí. Cuando creamos un servicio web, esperamos que nuestros clientes no necesiten hacer referencia a ningún dll por nuestra cuenta. Solo los tipos expuestos por el servicio web deberían ser suficientes para su uso (los servicios web se basan en la interoperabilidad, imagine que su aplicación cliente está escrita en Java, no puede hacer referencia a la DLL de .NET).

Es por eso que estos tipos se crean cuando hace referencia a un servicio web. En mi opinión, solo debes confiar en las clases generadas por el servicio web en tu aplicación cliente. Elimine la referencia al dll compartido del proyecto del cliente.

Esto no responde directamente a su pregunta, pero proporciona una alternativa para su problema.

+1

Downvoter, por favor brinde una explicación de su voto. Gracias. – Fabio

+0

Supongo que es porque no responde la pregunta. "Debo martillar esto con un viejo zapato o botella de vidrio" a pesar de eso. – stannius

+0

Sí, @stannius, tal vez esa sea la razón. Cambié mi respuesta un poco para que las personas con "zapatos de martilleo" no puedan quejarse sobre eso. Por cierto, espero que mi respuesta haya sido útil para ti, de alguna manera. – Fabio

1

Tuve el mismo problema, pero me olvidé de agregar la referencia al ensamblaje correcto con los tipos de solicitud/respuesta en mi cliente. Una vez que agregué esa referencia y me aseguré de que la casilla "Reutilizar tipos" estuviera activada en el cuadro de diálogo Agregar referencia de servicio, funcionó correctamente.

+1

-1: dice que está usando "Actualizar referencia web" –

1

En la clase de dominio, conjunto AnonymousType = false para evitar clase de generación con prefijo inesperado al agregar la referencia Web
[System.Xml.Serialization.XmlTypeAttribute (AnonymousType = false)] pero esto solo asegura que la clase, auto-gen en Reference.cs tiene la misma estructura que la clase de dominio.

Una forma de caminar aroud es serializar/deserializar al objeto de dominio.

Cuestiones relacionadas