2013-03-07 5 views
10

Ho due metodi nominato comeI metodi di overloading non sono supportati dal servizio WCF?

[OperationContract] 
UserAccount GetUser(Int32 id); 

[OperationContract] 
UserAccount GetUser(string username, string password); 

quando provo a costruire loro, hanno detto che non si può avere stessi metodi di nome nel servizio? È.

+1

Nota: [Polimorfismo] (http://en.wikipedia.org/wiki/Polymorphism_in_object-orientated_programming) è diverso dal sovraccarico. Inoltre, ti preghiamo di includere il messaggio di errore * esatto * nelle domande in quanto li rende un po 'più ricercabili (se qualcuno cerca il suddetto messaggio di errore). –

+0

Il sovraccarico è un'implementazione del polimorfismo. Il polimorfismo è un concetto astratto. –

+0

Il sovraccarico è ortogonale al polimorfismo ed esiste in alcuni linguaggi che non supportano il polimorfismo [sottotipo]. Il sovraccarico è anche assente in alcune lingue che supportano il polimorfismo [sottotipo]. L'override è generalmente associato al polimorfismo [sottotipo], ma sto digerendo .. –

risposta

14

Questa è una limitazione di WSDL. Non supporta gli stessi concetti di overload di C# /. NET, quindi i nomi dei metodi sui servizi devono essere unici. Hai due opzioni per risolvere il tuo problema.

Il primo è utilizzare nomi diversi per i metodi. L'altro è quello di impostare la proprietà Name su uno dei tuoi OperationContracts in questo modo

[OperationContract(Name="GetUserById")] 
UserAccount GetUser(Int32 id); 

[OperationContract] 
UserAccount GetUser(string username, string password); 
+0

gr8 grazie ... quindi ora lo riconoscerò come GetUserById o GetUser, am i ryt –

+3

@Arun Il nome è usato per Descrizione WSDL del tuo servizio WCF. Se si utilizza un normale client WCF, è necessario fornire i metodi di overload come sono stati definiti sulla propria interfaccia – Jehof

2

Prova questa:

- [OperationContract(Name= "GetUserWithID")] 
    UserAccount GetUser(Int32 id); 

- [OperationContract(Name= "GetUserWithUserName")] 
    UserAccount GetUser(string username, string password); 

More Info

4

WSDL non supporta gli stessi concetti sovraccarico del C#. Puoi usare Nome nel tuo OperationContract per specificare i tuoi metodi

[OperationContract(Name="GetUserInt")] 
UserAccount GetUser(Int32 id); 

[OperationContract(Name="GetUserString")] 
UserAccount GetUser(string username, string password); 
0

Questo è lo svantaggio di WCF. La ragione alla base di questo è che quando ci affidiamo al servizio per il cliente non ci dovrebbe essere alcuna duplicazione, altrimenti il ​​client confonderà quale metodo sta facendo cosa? Quindi ecco le opzioni per risolvere il problema. Utilizzando il diverso attributo del nome del Contratto Operativo.

[OperationContract (Name = "GetUserByID")]

AccountUtente GetUser (Int32 id);

[OperationContract (Name = "GetUserByUName_Password")]

AccountUtente GetUser (string username, string password);