2010-07-01 19 views
9

Ho un'applicazione server/client sviluppata in Delphi 2006. Il client è Win32 e il server è un servizio web .net 1.1.Servizio WCF esposto come ASMX non accetta i parametri

Siamo in procinto di aggiornare questo progetto, ma deve essere fatto in piccoli passi. Ho iniziato con il server e ho creato un progetto WCF in VS2010 (C# .net 4.0). Il primo passo è far funzionare il server in WCF senza cambiare il client. Così ho usato il modello di facciata, ho creato un'interfaccia simile al vecchio delphi Webservice aggiunto un riferimento alla vecchia .net 1.1 dll e nella mia implementazione ho appena chiamato il vecchio codice .net 1.1.

Passaggio successivo aggiornamento della classe proxy sul client. Questo fallì. L'importatore WSDL non ha compreso correttamente BasicHttpBinding, quindi la classe proxy generata non ha potuto sostituire il proxy esistente.

Dopo un po 'di ricerca ho trovato questo post sul blog.

http://kjellsj.blogspot.com/2006/12/how-to-expose-wcf-service-also-as-asmx.html

Questo ha funzionato, l'ASMX WSDL non era diverso rispetto al vecchio .net 1.1, quindi tutto ok appered.

Ma non lo era. Durante il test del nuovo servizio ho scoperto che tutti i miei parametri erano vuoti/nulli sul server. Ho provato con Fiddler sul client e i parametri sono presenti nell'XML che viene inviato al server.

Quindi sono bloccato. Qualche idea su come risolvere questo sarebbe molto apprezzata. C'è qualche codice che potrebbe essere interessante da vedere, poi fammi sapere.

+0

Così il WSDL è lo stesso, ma il server è ora .Net 4.0 invece di 1.1? Se il client Delphi utilizza lo stesso WSDL di prima, ma il server non vede più i parametri, vorrei scrivere un client in .Net e vedere se funziona. Se lo fa, confronta le richieste Soap di .Net e Delphi del cliente. – mjn

+5

Confronta l'XML. "Parametri nulli" di solito significa che c'è una differenza di spazio dei nomi tra ciò che viene inviato e ciò che è previsto. –

risposta

1

Mi sono imbattuto in un problema simile con un servizio Web asmx ... alcuni dati stavano perdendo i loro valori. Se si utilizzano dati gerarchici, potrebbe essere necessario dichiarare gli oggetti interni o ereditati utilizzando un attributo XmlInclude. Ad esempio, se si dispone di una classe utente utilizzata nel servizio e di una sottoclasse del cliente, potrebbe essere necessario dichiarare la classe Customer al servizio se non viene utilizzata direttamente in un metodo Web. Lo faresti come segue.

[XmlInclude(typeof(Customer))] 
public class Service : WebService 

Naturalmente, potrebbe non essere nulla a che fare con questo, quindi buona fortuna se è così. :)

0

Verificare che i nomi dei parametri nel nuovo servizio corrispondano ai nomi nel vecchio servizio. Se sono stati modificati i nomi dei parametri, questi non verranno mappati dall'XML, quindi saranno nulli nel codice di esecuzione.

0

Aggiungi attributo KnownType alle classi secondarie

Problemi correlati