Come posso avere due metodi con lo stesso nome in WCF?

Possibile duplicato:
perché non riesci a sovraccaricare un metodo in WCF?

sto lavorando su un progetto in cui utilizzo i servizi WCF. Il mio problema è che, nel servizio wcf, sto avendo un metodo chiamato “Display ()” che è usato da me client1. Ora voglio aggiungere un altro metodo con lo stesso nome ma con un parametro, es. “Visualizza (nome stringa)”, in modo che il nuovo clinet2 possa usare il nuovo metodo e il vecchio client1 possa usare il vecchio metodo. Come posso raggiungere questo objective. ecco il codice che ho scritto. 10Q in anticipo.

namespace ContractVersioningService { [ServiceContract] public interface IService1 { [OperationContract] string Display(); [OperationContract] string GoodNight(); } } namespace ContractVersioningService { public class Service1 : IService1 { public string Display() { return "Good Morning"; } public string GoodNight() { return "Good Night"; } } } namespace ContractVersioningService { [ServiceContract(Namespace = "ContractVersioningService/01", Name = "ServiceVersioning")] public interface IService2 : IService1 { [OperationContract] string Disp(string greet); } } namespace ContractVersioningService { public class Service2 : Service1, IService2 { public string Display(string name) { return name; } public string Disp(string s) { return s; } } } 

  Why WCF doesnot support method overloading directly ? 
  • Perché WSDL non supporta l’overloading dei metodi (non gli OOP). WCF genera WSDL che specifica la posizione del servizio e l’operazione oi metodi esposti dal servizio.

    Uso di WCF Stile WSDL Document / Literal : Microsoft ha proposto questo standard in cui l’elemento body soap conterrà il nome del metodo web.

  • Per impostazione predefinita, tutti i servizi WCF sono conformi allo standard letterale del documento in cui il corpo del soap deve includere il nome del metodo.

    L’unico modo è usare l’attributo Nome. Ad esempio,

      [OperationContract(Name="Integers")] int Display(int a,int b) [OperationContract(Name="Doubles")] double Display(double a,double b) 

Il compilatore genererà quanto segue, il che ha senso per l’individuazione di wsdl

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(ConfigurationName= "ServiceRef.IService1")] public interface IService1 { [System.ServiceModel.OperationContractAttribute( Action="http://tempuri.org/Service1/AddNumber", ReplyAction="http://tempuri.org/IHelloWorld/IntegersResponse")] int Display(int a,int b) [System.ServiceModel.OperationContractAttribute( Action="http://tempuri.org/IHelloWorld/ConcatenateStrings", ReplyAction="http://tempuri.org/Service1/DoublesResponse")] double Display(double a,double b) } 

OK, ho intenzione di rendere questa una risposta, dal momento che i commenti diventano eccessivamente eccessivi ormai.

Fondamentalmente hai due opzioni:

  • Usa un’interfaccia singola (nota che l’ereditarietà dell’interfaccia, come suggerisci nella tua domanda, conta tecnicamente come un’interfaccia qui), ma poi devi assegnare a ciascuna operazione di servizio un nome distinto. Puoi farlo nominando i metodi C # distinti oppure applicando l’attributo [OperationContract(Name = "distinctname")] .

  • Utilizza due interfacce separate, senza alcuna relazione di ereditarietà, pubblicandole su un endpoint diverso. È ansible avere quindi un’operazione di servizio in ciascuno, con lo stesso nome, ma con parametri diversi. Puoi ancora implementare entrambe le interfacce con una class di implementazione, se ti piace / vuoi, ovviamente.