2011-01-27 10 views
8

C'è un modo per modificare lo spazio dei nomi .NET di un'interfaccia ServiceContract di WCF e tuttavia rendere il servizio WCF retrocompatibile con i client che utilizzano il ServiceContract vecchio (identico tranne per lo spazio dei nomi)? Ad esempio, supponiamo di avere (in vb.net):Posso cambiare lo spazio dei nomi dell'interfaccia ServiceContract di WCF senza cambiare il servizio?

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

E voglio cambiare la situazione a

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

Senza cambiare il servizio a tutti.

Ho provato a farlo, ma i miei xsds a cui si fa riferimento da wsdl mostrano il nuovo nome dello spazio dei nomi, che sembra essere un'incompatibilità.

Qualche idea?

risposta

12

Fintanto che il nome e lo spazio dei nomi (XML) del contratto di servizio non cambiano - sicuro! I servizi WCF in realtà non si preoccupano degli interni .NET di come sono implementati.

questo funziona fino a quando il lato client si collega al vostro servizio utilizzando il Add Service Reference metodo standard (interrogare i metadati del servizio per creare un proxy lato client separato) - in questo caso, il proxy lato client ha alcuna conoscenza di qualsiasi spazio dei nomi .NET sul lato del servizio ... puoi cambiarli dal lato del servizio e ridistribuire i tuoi file di servizio: il client continuerà a funzionare.

L'unico posto è necessario effettuare una regolazione è nella configurazione del vostro lato di servizi (nel web.config se si ospitano in IIS, nel del vostro hoster app.config altrimenti):

  • il <service> attributi del tag name= ha la classe di servizio nome completo tipo .NET (incluso namespace .NET)

  • attributo del tag <endpoint>contract= ha del contratto di servizio completo nome di tipo .NET (incluso namespace .NET)

Questo non funziona, ovviamente, se si condivide un assemblea comune con il contratto di servizio - in tal caso, il lato client sarà legato allo spazio dei nomi .NET di quei file di contratto in un'assemblea comune e se tali modifiche, il client non funzionerà più ..

+0

+1 per una risposta completa – vlad

+0

Non sto utilizzando "Aggiungi riferimento servizio" - ha dato risultati inaspettati - vedi http://stackoverflow.com/questions/1294269/getting-bad-generated-code-from-update-service-reference. Forse funzionerà comunque? Ci proverò presto. –

+1

@Patrick Szalapski: beh, in questo caso, probabilmente stai condividendo l'assemblaggio dei contratti tra il servizio e il cliente, giusto ?? In tal caso, ** ovviamente **, la modifica degli spazi dei nomi sul contratto di servizio ** influirà ** sul client, senza alcun senso. –

Problemi correlati