2014-07-07 11 views
15

Ich möchte LinqPad mit einem WCF-Webdienst verbinden, der seine WSDL-Informationen an einem URI des Formulars http://server.example.com/Product/Service/Version/Soap11?wsdl verfügbar macht. Ich kann diesen URI erfolgreich als Visual Studio WCF-Webdienst-Referenz hinzufügen, und es funktioniert auch mit WcfTestClient.Verbinden Sie LinqPad mit WCF-Webdienst mit? Wsdl URI-Abfrage

Der tatsächliche Endpunkt des Dienstes beim Herstellen einer Verbindung zu Aufrufmethoden ist http://server.example.com/Product/Service/Soap11.

Wenn ich versuche, den Webdienst als LinqPad-Verbindung hinzuzufügen, wenn ich die URI des Web-Service einschließlich der ?wsdl Abfrage angeben, erhalte ich eine LinqPad-Fehlermeldung "ArgumentException: Expected eine absolute, wohlgeformte http URL ohne Abfrage oder Fragment. Parametername: serviceRoot ". Wenn ich die Abfrage ?wsdl weglassen, erhalte ich stattdessen eine Antwort.

(Ich bekomme die gleiche 400 Bad Request Antwort, wenn ich versuche, eine Visual Studio Web Service-Referenz zu erstellen, oder fügen Sie den Dienst zu WcfTestClient, ohne ?wsdl an den URI anhängen).

Gibt es irgendetwas, was ich am Client ändern kann, damit LinqPad erfolgreich eine Verbindung zu diesem Webdienst herstellt? Oder muss ich mich mit der Konfiguration am Server-Ende herumschlagen? Ich kontrolliere nicht die Web-Dienste, mit denen ich mich verbinden möchte, aber ich kann vielleicht einige Konfigurationsdateien auf dem Server optimieren, wenn ich muss.

Antwort

22

Schauen Sie sich wie folgt zusammen:

https://github.com/dylanmei/linqpad-soap-driver

Es ist ein Drittanbieter LINQPad Treiber für SOAP-basierte Web-Services.

+0

Danke für die Empfehlung. Dies ist definitiv schneller zu laufen als der manuelle Prozess in meiner eigenen Antwort. – Hydrargyrum

+6

Ich habe dies gegen einen WCF-Dienst versucht und es hat nichts generiert. Ich habe folgende Fehler: Warnung> Diese Webreferenz entspricht nicht dem WS-I Grundprofil v1.1. Warnung> SOAP 1.1-Bindung wurde nicht gefunden: Das WS-I-Basisprofil 1.1 enthält Implementierungsrichtlinien, die empfehlen, wie eine Reihe von Webservicespezifikationen zusammen verwendet werden sollten, um interoperable Webdienste zu entwickeln. Für das 1.1-Profil lauten diese Spezifikationen SOAP 1.1, WSDL 1.1, UDDI 2.0, XML 1.0 und XML-Schema. Fehler> Es wurden keine Klassen generiert. > Kann keine Verbindung herstellen. –

+1

@MikeK: Die Verwendung der Bindung "basicHttpBinding" löste das Problem für mich und ich konnte einen Dienst hinzufügen. Stellen Sie außerdem sicher, dass Sie aus der Liste, die Sie erhalten (alle verfügbaren Bindungen), diejenige ausgewählt haben, die mit "BasicHttpBinding_" beginnt. – Kamarey

1

Das hängt wirklich davon ab, wo Ihre Stärken liegen. Es ist nicht einfach, basierend auf der Frage zu urteilen, da es nur Versuche beschreibt, automatisierte Tools auszuführen. Fragen bei SO haben meist einen "was habe ich bisher probiert" -Teil. Dies dient nicht nur dazu, Bemühungen vor dem Posten zu fördern, sondern auch um zu sehen, welche Wege vorgeschlagen werden könnten.

Eine große Frage hier ist, wenn Sie genug wissen (oder bereit sind, zu lesen), die Funktionen der Funktion zum Hinzufügen von Service-Referenz, um es in Code zu reproduzieren. Oder wenn Sie ein Open-Source-Projekt mit geeigneten Lizenzen finden können, um es zu nutzen.

Ich würde vorschlagen, dass Sie in writing LINQPad data extentions suchen.

+0

Danke! Ja, angesichts meines jetzt verbesserten Verständnisses des Anwendungsbereichs von LINQPads eingebautem "WCF Data Services" -Treiber sieht es so aus, als wäre ein benutzerdefinierter Datenkontexttreiber der richtige Weg, diese Dienste als LINQPad-Verbindungen verfügbar zu machen. – Hydrargyrum

6

Es sieht so aus, als ob ich den Umfang der Funktion "Verbindung hinzufügen" von LINQPad falsch interpretiert habe. Es ist nur für WCF Data Services (die die OData-Spezifikation implementieren), nicht für WCF-Webdienste im Allgemeinen. (Der Unterschied zwischen WCF-Diensten im Allgemeinen und WCF Data Services war mir zuvor nicht klar).

Die Dienste, mit denen ich eine Verbindung herstellen möchte, sind WCF-Webdienste, aber sind keine WCF Data Service-Webdienste. Es stellt sich heraus, dass der richtige Weg für mich, diese Webdienste von LINQPad zu konsumieren ist, einen Proxy-Klassencode & Konfigurationsdatei mit Svcutil.exe zu generieren, die dann durch VS oder csc.exe kompiliert werden kann, und die resultierende Assembly wird dann hinzugefügt als eine Standard-Assembly-Referenz in LINQPad. Die Proxy-Klassen können dann in LINQPad genauso verwendet werden, wie sie in Visual Studio verwendet werden.

+0

Das ist ein interessanter Ansatz.Warum verbinden Sie den WCF Test Client nicht einfach so? –

+0

Wenn ich das richtig verstehe, ist WCF Test Client genau das, was hinter den Kulissen funktioniert: greifen Sie auf die WSDL, erstellen Sie Proxy-Klassen und erstellen Sie auf dieser Basis eine Benutzeroberfläche für den Benutzer. (Gleiches für WebServiceStudio). Liege ich falsch? – Hydrargyrum

+0

Wahrscheinlich. Mein Problem ist, dass ich einen Service mit einer Unmenge von Methoden habe, die DataTables oder DataSets zurückgeben, die vom WCF Test Client nicht unterstützt werden. –