2012-07-02 15 views
9

Se il mio contratto si presenta come segue:Come è possibile evitare che un parametro esterno finisca con il parametro di ritorno in un servizio Web WCF?

[OperationContract] 
void DoSomething(int id, out string moreInfo); 

questo finisce per assomigliare:

string DoSomething(int id); 

quando si importa un riferimento al servizio Web. È possibile influenzare l'auto-conversione dell'ordine dei parametri? Era già sorprendente trovare tutti i parametri esterni all'inizio della firma della funzione, ma era ancora fattibile, ma vorremmo che i metodi void continuassero a essere metodi void. O si tratta di una limitazione SOAP?

+1

In questo caso, un metodo vuoto con un singolo parametro 'out' è effettivamente un metodo non vuoto con il valore restituito corretto. Che cosa significa definire un parametro 'out' che la versione non-out non lo è? –

+0

@AdamHouldsworth ortogonalità nella progettazione dei servizi web. Inizialmente avevamo servizi che restituivano un valore e altri no. Tuttavia, ogni servizio è stato refactored per restituire gli stati. Forzando il parametro extra, la build fallirà automaticamente e sapremo cosa risolvere dove, oltre al fatto che è semplicemente conveniente sapere sempre che il primo param è un out-param che contiene gli stati, indipendentemente dal resto del contratto. – Abel

+3

Sono davvero molto sorpreso e impressionato dal fatto che WCF sia stato in grado di generare un proxy per quell'operazione! Qual è la logica per l'utilizzo di un parametro 'out' in primo luogo? – MattDavey

risposta

4

Sembra essere basata su una limitazione WSDL: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/48b5992f-f7bd-4b67-8299-514d1780fa9a

WSDL non mostra la firma metodo originale; invece, mostra i parametri di input come un gruppo e i parametri di output come un altro gruppo .

La limitazione di non essere in grado di separare i valori di ritorno dai parametri out è nel WSDL. Ma questo significherebbe che la limitazione di un metodo void sarebbe parte di svcutil.exe, penso. Non c'è motivo per cui non ci possa essere un passaggio su svcutil per non spostare il primo output su un valore di ritorno, ma quella sarebbe una richiesta per una funzione su ms connect.

Anziché annullare, è possibile restituire un semplice stato int o bool se il problema è la coerenza, ma sono sicuro che non è una risposta perfetta se si dispone già di dozzine di metodi.

+1

Mi sono imbattuto nello stesso link pochi minuti fa. In effetti, è una limitazione del WSDL sottostante, a quanto pare. Il wrapper potrebbe usare, naturalmente, qualsiasi ordine, ma non vedo un caso d'uso per forzarlo. Lavoreremo intorno alle limitazioni, quindi, almeno useremo un tipo VoidResponse per rendere più facile il refactoring per il momento. – Abel

+0

Buona idea sul tipo VoidResponse. –