2014-09-09 2 views
5

Ich erstellte erfolgreich einen Dienst-Moniker als Client für meinen WCF-Dienst. Aber ich kann keine Methode auf dem Moniker aufrufen.Automatisierungsfehler beim Aufrufen der Methode auf WCF Mex Moniker mit Excel

Am WCF-Dienst Ende habe ich eine Dummy-Methode mit dem Namen Testmethod, wie folgt:

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

folgende Code den Moniker in Excel erstellt.

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 

Der obige Code funktioniert bis zu dem GetObject Anruf, was bedeutet, dass der Moniker erfolgreich erstellt wird. Aber ich bekomme einen Fehler, sobald ich versuche, irgendeine Methode aufzurufen.

Automation Error

Die WCF-Methode funktioniert perfekt ok mit Microsoft WCF Test Client und anderen WCF-Clients. Ich weiß also, dass es mit dem Service selbst kein Problem gibt.

Antwort

1

Für alle, die das gleiche Problem haben, hier ist die Lösung. Ich fand die Ursache des Problems selbst durch ein wenig Nachforschung heraus, und unten ist, was ich getan habe, um es zu umgehen.

Ursache des Problems

(Es scheint wie) Programme, die COM-Schnittstellen verwenden, um eine Monikerzeichenfolge zu WCF-Dienste verbinden verwenden, haben Probleme mit komplexen Typen (wie Klassen, Strukturen, Arrays etc.). Sie können nur mit einfachen Typen arbeiten (wie String, Integer, Dezimal, Boolean usw.). Komplexe Typen in den Methodenargumenten oder im Rückgabetyp funktionieren nicht.

Auch wenn die Methode, die Sie aufrufen möchten, keine komplexen Typen in ihren Methodenargumenten oder im Rückgabetyp hat, funktionieren sie nicht, wenn mindestens eine Methode im Service vorhanden ist.

In meinem Fall hatten die Methoden, an denen ich interessiert war, keine komplexen Typen als Methodenargumente oder Rückgabetypen.

Meine Lösung

Einmal habe ich herausgefunden, was die Probleme verursacht wurde, eine Lösung zu finden um es einfach war. Ich habe gerade einen separaten WCF-Dienst (Schnittstelle) für die Methoden meines Interesses erstellt und sichergestellt, dass keine komplexen Typen öffentlich verfügbar gemacht werden, d. H. Keine komplexen Typen in Methodendefinition - Methodenargumente und Rückgabetypen.

Als Nächstes habe ich eine Klasse erstellt, die diese Schnittstelle wie bei jedem anderen WCF-Dienst implementiert. Ich habe diese Klasse von der ursprünglichen Klasse abgeleitet, so dass ich nicht die gesamte dort implementierte Geschäftslogik wiederholen muss. Der einzige Zweck, den diese Klasse löst, ist, über die Begrenzung hinauszugehen, der ich gegenüberstand. Es war nur ein Wrapper um die ursprüngliche Klasse mit einer begrenzten Anzahl von Methoden. Die Methoden haben einfach die Basisklassen-Äquivalenzmethode aufgerufen und die resultierende Ausgabe direkt an den Client zurückgegeben.

Dann änderte ich meine app.config Datei, um diesen neuen Dienst zu hosten, und ersetzte dann die Dienstadresse in Monikerzeichenfolge mit dieser neuen Dienstadresse. Also habe ich im Grunde genommen zwei WCF-Dienste gehostet - einen für die Clients, die komplexe Typen verwenden können, und den anderen für diejenigen, die das nicht können.

Das war alles, was benötigt wurde, und alles funktioniert perfekt OK jetzt.:)


HINWEIS, dass dies nur auf meiner eigenen Beobachtung basiert, und ich könnte falsch sein. Vielleicht fehlt mir etwas, und es könnte bessere Wege geben, dieses Problem zu umgehen. Wenn Sie feststellen, dass dies der Fall ist, können Sie Ihre Lösung kommentieren oder posten.

Verwandte Themen