none
Dienstverweis (Service Reference) in Visual Studio 2013 SP4

    Frage

  • Hallo,

    ich habe unter https://stackoverflow.com/questions/3100458/soap-client-in-net-references-or-examples ein Beispiel gelesen wie man in Visual Studio durch Hinzufügen eines Dienstverweises an einen SOAP-Dienst "andocken" kann, d.h. man hat die Funktionen und die Datenstrukturen als autogenerierte Klassen zur Verfügung und kann damit kommunizieren.

    Bei dem konkreten Projekt, das ich umsetzen will, war zunächst der Dienst nicht verfügbar, aber die WSDL-Datei, die für die Generierung des Codes verwendet wird. Dazu gab es einen weiteren Artikel (https://stackoverflow.com/questions/12710281/how-to-generate-service-reference-with-only-physical-wsdl-file),  der besagt, dass diese Datei reicht. Auch das hat gut geklappt. Natürlich kann man dann nichts ausprobieren. Der Dienst ist inzwischen online, allerdings mit Benutzername/Passwort-Anmeldung.

    Daher nun die zwei Fragen:

    1. Wie kann ich die Service Reference, die Visual Studio aus der WSDL-Datei generiert hat, so anpassen, dass auch auf den konkreten Dienst zugegriffen wird? Reicht es z.B. in der WSDL-Datei in der Zeile            

    <soap:address location="https://URL_NOT_SPECIFIED"/>

    die richtige URL einzutragen und die Service Reference neu zu erzeugen?

    2. Wie kann ich Benutzername und Passwort übergeben?

    Viele Grüße

    Peter

    Freitag, 28. Juli 2017 12:44

Antworten

Alle Antworten

  • Hallo Peter,

    wie Du schon richtig festgestellt hast, wird beim erstellen einer Servicereferenz eine Proxyklasse erzeugt. Anschließend kannst Du über die Klasse mit dem Endpunkt kommunizieren. Dieses Ziel MUSS zur Designzeit eingestellt werden und kann zur Laufzeit nicht angepasst werden. Falls Du dies dennoch tun möchtest, musst Du einen "dynamischen Webserviceproxy" schreiben. Hier die aus meiner Sicht beste Lösung für das Problem: 

    http://www.c-sharpcorner.com/uploadfile/f9935e/invoking-a-web-service-dynamically-using-system-net-and-soap/

    Eine weitere Sache bzgl. SOAP ist, dass das Visual Studio zwei Arten von Webservices kennt: die klassischen (ASMX) Services, mit denen auch Java, PHP, etc. kommunizieren kann und die neuen WCF Services (Windows Communication Foundation). Wenn Du eine "normale" Servicereference hinzufügst, dann geht das Visual Studio immer von den neuen WCF Services aus, was insbesondere bei den SOAP Headern zu Problemen führen kann. Lösch mal Deine Referenz und füge eine neue nach dieser Anleitung hinzu, um den Service als ASMX-Dienst anzubinden:

    https://msdn.microsoft.com/de-de/library/bb628649.aspx?f=255&MSPPError=-2147217396


    Ich hoffe, das hilft Dir weiter.

    Beste Grüße
    Christian

    Montag, 31. Juli 2017 06:25
  • Hallp Peter,

    es kommt ein wenig darauf an, wie genau Du den Webservice integriert hast. Es gibt da verschiedene Optionen.

    Bei einem normalen Dienstverweis generiert Visual Studio normalerweise etwas in der Art wie:

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="Dienstname_SOAP11Binding" ...>
                    <security mode="...">
                        ...
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://abc.domain.tld/Dienst.svc"
                binding="basicHttpBinding"
                bindingConfiguration="Dienstname_SOAP11Binding"
                contract="Anbieter.Dienstname"
                name="SOAPOverHTTP" />
        </client>
    </system.serviceModel>

    Über die app.config der Anwendung, die letztendlich gestartet wird, kannst Du diese Angaben auch anpassen. In deinem Fall wäre endpoint -> address das, was Du suchst.

    Bei einem klassichen ASP.NET Webservice ist das letztendlich genauso, es steht eben nur .asmx im Url.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 31. Juli 2017 06:45
    Moderator
  • Hallo Stefan,

    vielen Dank für den Hinweis. Tatsächlich gibt es auch in app.config einen Verweis auf https://URL_NOT_SPECIFIED.

    Weitere Verweise gibt außerdem noch in der configuration.svcinfo, configuration91.svcinfo und wie gesagt in der wsdl-Datei. Teilweise sind das aber generierte Dateien, kann ich diese trotzdem einzeln anpassen oder würde ich damit Inkonsistenzen erzeugen?

    Herzliche Grüße

    Peter


    • Bearbeitet peter.sx Montag, 31. Juli 2017 14:14 Grammatikfehler
    Montag, 31. Juli 2017 14:14
  • Hallo Peter,

    die WSDL ist die vom Service selbst. Du sprichst ja vom Client.

    Eigentlich musst Du nur <endpoint address="..." /> ändern, mehr nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert peter.sx Dienstag, 1. August 2017 07:05
    Montag, 31. Juli 2017 14:20
    Moderator
  • Hallo Christian,

    vielen Dank für Deine Antwort. Das Ziel zur Designzeit einzustellen ist nicht das Problem. Was aber nicht geht, ist das Ziel schon zum Zeitpunkt der Erstellung der Service-Referenz und der Proxyklasse einzustellen, da Visual Studio keine Möglichkeit bietet, dabei schon Username und Passwort mitzugeben. Das müsste dann anschließend manuell erfolgen.

    Den Hinweis im zweiten Link habe ich ausprobiert, es kommt aber folgende Fehlermeldung:

    Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..
    Fehler bei Authentifizierung, da die Gegenseite den Transportstream geschlossen hat.

    Damit bin ich wieder bei der zweiten Frage, wie übergebe ich Benutzername und Passwort?

    Herzliche Grüße

    Peter

    Montag, 31. Juli 2017 15:03
  • Hallo Peter,

    für die Meldung kann es mehrere Gründe geben. Es wäre sehr hilfreich, wenn Du ein minimales Beispielprojekt mit Angabe des korrekten Dienst URLs erstellen und das Beispielprojekt, mit welchem man den Fehler selbst nachstellen kann, zum Download bereitstellen könntest.

    Falls möglich, wäre es für die weitere Hilfestellung sehr nützlich, wenn Du einen Testzugang für den Dienst hättest. Falls Du letzteres nicht öffentlich posten kannst/willst, kannst Du mir die Zugangsdaten auch gerne per Mail an info@asp-solutions.de zukommen lassen. Ich schaue dann mal, ob ich dir da helfen kann.

    Um Benutzername und Passwort zu übergeben, musst Du dir mit Workarounds helfen.

      https://stackoverflow.com/questions/3725294/set-wcf-clientcredentials-in-app-config

    Je nach Anforderung kann man den Ansatz, eigene appSettings Einträge für die Daten zu verwenden, schon hernehmen. Allerdings nur, wenn man den Abschnitt dann auch verschlüsselt.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 31. Juli 2017 15:18
    Moderator