Mit Reflexion zu nennen ASP.NET web-service
Sagen, ich habe eine ASMX-web-service MyService. Der service hat eine Methode MyMethod. Ich könnte ausführen MyMethod auf der server-Seite wie folgt:
MyService service = new MyService();
service.MyMethod();
Muss ich tun, ähnlich, mit service und mit der Methode erst zur Laufzeit bekannt.
Gehe ich davon aus, dass die Reflexion ist der Weg zu gehen. Leider, ich habe eine harte Zeit, dass es funktioniert. Wenn ich diesen code ausführen:
Type.GetType("MyService", true);
Es wirft diese Fehlermeldung:
Konnte nicht geladen werden Typ 'MyService' aus assembly 'App_Web__ktsp_r0, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
Jede Beratung wäre geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, ob dies der beste Weg, um darüber zu gehen. Der offensichtlichste Weg für mich, wäre, eine HTTP-Anforderung, und rufen Sie den webservice mit einer tatsächlichen HTTP-GET oder POST. Mit Ihrer Methode, ich bin mir nicht ganz sicher, wie youd, die Daten, die Sie senden, um die web-service. Ich habe einige Beispiel-code in VB.Net
//Try this ->
Obwohl ich nicht weiß, warum Reflexion nicht für Sie arbeiten dort (ich nehme an, der compiler könnte die Schaffung einer neuen Klasse von Ihrem
[WebService]
Anmerkungen), hier ist einige Ratschläge, die vielleicht dein problem lösen:Halten Sie Ihre WebService-einfache, flach, kurz: Eine Implementierung des Fassade Muster.
Machen Sie Ihre service-delegieren-Berechnung, um eine Implementierung der Klasse, die sollte sich leicht aufrufbar sein, durch Reflexion. Auf diese Weise werden die WebService-Klasse ist nur eine Fassade für Ihre Anlage - Sie können sogar eine E-Mail-handler, XML-RPC-frontend etc., da Ihre Logik ist nicht gekoppelt an den WebService, sondern um eine tatsächliche business-Schicht-Objekt.
Denke der WebService-Klassen UI-layer-Objekte in Ihrer Architektur.
Hier eine schnelle Antwort kann mir jemand wohl weiter ausbauen.
Wenn Sie die WSDL-Template-app (WSDL.exe) zu genereate service Wrapper, es baut sich eine Klasse des Typs SoapHttpClientProtocol. Sie können es auch manuell:
Habe ich noch nicht getestet mit diesem code, aber ich denke es sollte funktionieren stand-alone, ohne dass die WSDL-tool.
Den code, den ich habe ist der Aufrufer-code, die Haken bis zu den web-service über eine remote-Anruf (auch wenn aus irgendeinem Grund, Sie nicht wirklich wollen, dass es ferngesteuert werden.) Die Invoke-Methode kümmert sich um Verpackung es wie ein Soap-Aufruf. @Dave Ward ' s code ist korrekt, wenn Sie wollen, zu umgehen, um den web-service-Aufruf per HTTP - so lange, wie Sie tatsächlich in der Lage, den Verweis auf die Klasse. Vielleicht ist der interne Typ ist nicht "MyService" - man müsste untersuchen Sie den code des Steuerelements, um sicher zu wissen.
@Kibbee: ich muss vermeiden, den HTTP-Leistungs-hit. Es wird kein remote-Aufruf, so dass alle, die zusätzlichen Aufwand sollte unnötig.
@Daren: ich Stimme definitiv mit diesem design-Philosophie. Das Problem hier ist, dass ich nicht gehen, um die Kontrolle über den Dienst oder seine zugrunde liegenden business-Logik.
Dies ist für ein server-control, die es zu führen gegen einen beliebigen service/Methode, orthogonal zu, wie der web-service selbst implementiert wird.
Obwohl ich nicht sagen kann, aus deinem Beitrag:
Eine Sache im Auge zu behalten ist, dass, wenn Sie reflektion verwenden, müssen Sie erstellen eine Instanz der automatisch generierten webservice-Klasse(die, die Ihr webservice WSDL). Nicht erstellen Sie die Klasse, die responsbile für die server-Seite des Dienstes.
Also, wenn Sie einen webservice
können Sie nicht auf diese assembly verweisen, in der Sie Ihre Kunden und tun Sie etwas wie:
@Radu: ich bin in der Lage, erstellen Sie eine Instanz und rufen Sie die Methode genau so. Zum Beispiel, wenn ich in diesem ASMX:
Ich bin in der Lage, um es von einer ASPX-Seite codebehind wie diese:
Werden Sie sagen, dass nicht funktionieren sollte?
Ich blickte zurück auf diese Frage, und ich denke, was Sie gegenüberstehen, ist, dass die ASMX-code wird in eine DLL mit einem zufälligen Namen als Teil der dynamischen Zusammenstellung Ihrer Website. Ihr code, um die Art, standardmäßig, Suche nur seinen eigenen Endmontage (weitere App_Code-DLL, die von den blicken der Fehler, den Sie erhalten) und core libraries. Sie könnten eine bestimmte assembly reference "TypeName, AssemblyName" zu GetType() aber das ist nicht möglich im Fall der automatisch generierten Baugruppen, die haben neue Namen nach jedem kompilieren.
Lösung.... Ich habe nicht dies selbst getan, bevor, aber ich glaube, dass Sie sollten in der Lage sein, etwas zu verwenden, wie diese:
als BuildManager ist sich bewusst, dass die DLLs, die es geschaffen hat und weiß, wo man suchen muss.
Denke ich, dass dies wirklich nicht zu tun haben mit Web-Services, aber wenn es Ihr eigener code, Daren Recht über die Fassade-Muster.