2014-09-09 19 views
5

Ho creato correttamente un moniker di servizio come client per il servizio WCF. Ma non sono in grado di chiamare alcun metodo sul moniker.Errore di automazione durante il richiamo del metodo su WCF mex Moniker con Excel

Alla fine servizio WCF Ho un metodo fittizio chiamato TestMethod, come segue:

Public Function TestMethod(ByVal TestValue As String) As String Implements ICustomerService.TestMethod 
     Return "You said.... " & TestValue 
    End Function 

codice seguente crea il moniker in Excel.

Public Sub WCFMexMonkierDemo() 
    ' Create a string for the service moniker including the content of the WSDL contract file 
    Dim mexMonikerString As String 
    mexMonikerString = "service:mexAddress='http://localhost/CustomerService.svc/mex'" & _ 
         ", address='http://localhost/CustomerService.svc'" & _ 
         ", binding=CustomerServices.CustomerService" & _ 
         ", bindingNamespace='http://tempuri.org/'" & _ 
         ", contract=ICustomerService" & _ 
         ", contractNamespace='http://tempuri.org/'" 

    ' Create the service moniker object 
    Dim mexMoniker, result 
    Set mexMoniker = GetObject(mexMonikerString) 

    result = mexMoniker.TestMethod("client call")  '<-- error on this line 
    'Set result = mexMoniker.TestMethod("client call") 
    MsgBox result 

    Set mexMoniker = Nothing 
    Set result = Nothing 
End Sub 

Il codice precedente funziona fino al GetObject chiamata, il che implica che il moniker viene creato correttamente. Ma ricevo un errore non appena provo a chiamare qualsiasi metodo su di esso.

Automation Error

Il metodo WCF funziona perfettamente ok con Microsoft prova WCF client, e altri client WCF. Quindi so che non c'è alcun problema con il servizio stesso.

risposta

1

Per chiunque abbia lo stesso problema, ecco la soluzione. Ho scoperto la causa del problema da solo con un po 'di ricerca, e di seguito è quello che ho fatto per aggirarlo.

Causa del problema

(Sembra) I programmi che utilizzano interfacce COM utilizzando una stringa moniker per connettersi a servizi WCF avere problemi con i tipi complessi (come le classi, strutture, array, ecc). Possono funzionare solo con tipi semplici (come stringa, intero, decimale, booleano ecc.). I tipi complessi negli argomenti del metodo o nel tipo restituito non funzionano.

Anche se il metodo che si desidera chiamare potrebbe non avere alcun tipo complesso nei relativi argomenti del metodo o tipo restituito, non funzionerà se nel servizio è presente almeno un metodo.

Nel mio caso, i metodi a cui ero interessato non avevano tipi complessi come argomenti metodo o tipi restituiti.

mia soluzione

Una volta ho scoperto che cosa stava causando i problemi, trovare una soluzione intorno era facile. Ho appena creato un servizio WCF separato (interfaccia) per i metodi di mio interesse e ho assicurato che non ci sono tipi complessi esposti pubblicamente, vale a dire nessun tipo complesso nella definizione del metodo - argomenti del metodo e tipi di ritorno.

Successivamente ho creato una classe che implementa questa interfaccia, come con qualsiasi altro servizio WCF. Ho derivato questa classe da quella originale, in modo da non dover ripetere tutte le logiche di business implementate lì. L'unico scopo di questa classe è di superare la limitazione che stavo affrontando. Era solo un involucro attorno alla classe originale con un numero limitato di metodi. I metodi si chiamavano semplicemente il metodo equivalente della classe base e restituivano l'output risultante direttamente al client.

Quindi ho modificato il file app.config per ospitare questo nuovo servizio, quindi ho sostituito l'indirizzo di servizio in stringa moniker con questo nuovo indirizzo di servizio. Quindi, fondamentalmente ho finito per ospitare due servizi WCF: uno per i clienti che possono consumare tipi complessi e l'altro per quelli che non possono.

Questo è tutto ciò che è richiesto e tutto funziona perfettamente OK ora.:)


NOTA che questo è basato sulla mia propria osservazione, e potrei sbagliarmi. Potrebbe esserci qualcosa che potrebbe mancare e potrebbero esserci modi migliori per aggirare questo problema. Se trovi che questo è il caso, sentiti libero di commentare o pubblicare la tua soluzione.

Problemi correlati