2011-01-27 15 views
8

¿Existe alguna manera de cambiar el espacio de nombres .NET de una interfaz WCF ServiceContract y aún así hacer que el servicio WCF sea compatible con versiones anteriores con clientes que están utilizando el antiguo (idéntico excepto por el espacio de nombres) ServiceContract? Por ejemplo, supongamos que tengo (en vb.net):¿Puedo cambiar el espacio de nombre de la interfaz de WCF ServiceContract sin cambiar el servicio?

Namespace MyCompany.MyPoorlyNamedProject 
    <ServiceContract(Name:="ThingService")> _ 
    <CLSCompliant(True)> _ 
    Public Interface IThingService 
     ... 
    End Interface 
EndNamespace 

Y quiero cambiar eso a

Namespace MyCompany.MyProject 
    <ServiceContract(Name:="ThingService")> _ 
    <CLSCompliant(True)> _ 
    Public Interface IThingService 
     ... 
    End Interface 
End Namespace 

Sin cambiar el servicio en absoluto.

Intenté simplemente hacerlo, pero mis xsds a los que se hace referencia desde el wsdl muestran el nuevo nombre del espacio de nombres, que parece ser una incompatibilidad.

¿Alguna idea?

Respuesta

12

Siempre que el nombre y el espacio de nombres (XML) de su contrato de servicio no cambien, ¡seguro! Los servicios de WCF realmente no se preocupan por las partes internas de .NET de cómo se implementan.

Esto funciona siempre y cuando el cliente se conecta a su servicio mediante el Add Service Reference método estándar (interrogar a los metadatos del servicio para crear un proxy del lado del cliente por separado) - en ese caso, el proxy del lado del cliente tiene ningún conocimiento de los espacios de nombres .NET del lado del servicio ... puede cambiarlos en el lado del servicio y volver a implementar sus archivos de servicio; el cliente continuará trabajando.

El único lugar que necesita para hacer un ajuste está en la configuración de su lado de servicio (en web.config si se está hospedando en IIS, en app.config de su proveedor de alojamiento lo contrario):

  • la <service> atributo de la etiqueta name= tiene la clase de servicio nombre completo de tipo .NET (incluido el espacio de nombres de .NET)

  • atributo de la etiqueta <endpoint>contract= tiene nombre completo de tipo .NET de contrato de servicios (incluyendo espacio de nombres de .NET)

Esto no funciona, obviamente, si comparte una asamblea común con el contrato de servicio - en ese caso, el lado del cliente se vinculará al espacio de nombres .NET de esos expedientes de los contratos en una asamblea común y Si los cambios, el cliente no va a funcionar más ..

+0

1 para una respuesta completa – vlad

+0

no estoy usando "Agregar referencia de servicio" - que dio resultados inesperados - ver http://stackoverflow.com/questions/1294269/getting-bad-generated-code-from-update-service-reference. Tal vez esto funcionará de todos modos? Lo intentaré pronto. –

+1

@Patrick Szalapski: bueno, en ese caso, probablemente estés compartiendo el ensamblaje de contratos entre el servicio y el cliente, ¿verdad? En ese caso, ** por supuesto **, cambiar los espacios de nombres en su contrato de servicio ** afectará ** al cliente, no hay forma de evitarlo. –

Cuestiones relacionadas