C++ WebService->Metadata freigeben

10. März 2010 21:33

Hallo,

ich weiß erstmal nicht, ob das Problem hier überhaupt in das Forum passt. Vielleicht hatte ja jemand selber mal das Problem.
Was ist vorhabe ist recht simpel. Ich würde gerne einen C++ WebService Client entwickeln. Quasi aus der heilen .NET Welt ausbrechen;-)

WebServices die man ist nativ C++ einbinden kann ist im Moment eine recht heiße Sache und erst Windows 7 bring standardmäßig eine API dafür mit. Nachrüsten lässt sich das ganze jedoch auf allen Systemen ab XP.

Nun gibt es eine einfache Vorgehnsweise um den WebService einzubinden.
Im Windows 7 SDK gibt es zwei Tools:
-svcutil.exe
-wsutil.exe

Hier mal die Beschaffung der Daten eines "normalen" WCF Service.
Das svcutil.exe benötigt beispielsweise folgenden Parameter bzw Aufruf:

(Auf der cmd): svcutil.exe http://localhost:1068/Service1.svc?wsdl

Anschließend werden mir drei *.xsd (XML Schema File) Dateien und eine *.wsdl(Web Services Description Language) Datei erzeugt.
Diese werden dann mit dem zweiten Tool weiterverarbeitet. Dabei werden dann die entsprechenden *.h(Header) und *.c(C Code) Dateien erzeugt.

Ich müsste jedoch das "svcutil" mit folgendem Parameter aufrufen:
http://m6400:7047/DynamicsNAV/WS/CRONUS ... t/Multiply

Wenn ich das im WebBrowser tue dann bekomme ich, wie üblich, folgendes Ergebnis:

Code:
- <definitions targetNamespace="urn:microsoft-dynamics-schemas/codeunit/Multiply" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:microsoft-dynamics-schemas/codeunit/Multiply">
- <types>
- <schema elementFormDefault="qualified" targetNamespace="urn:microsoft-dynamics-schemas/codeunit/Multiply" xmlns="http://www.w3.org/2001/XMLSchema">
- <element name="Multiply">
- <complexType>
- <sequence>
  <element minOccurs="1" maxOccurs="1" name="wert1" type="int" />
  <element minOccurs="1" maxOccurs="1" name="wert2" type="int" />
  </sequence>
  </complexType>
  </element>
- <element name="Multiply_Result">
- <complexType>
- <sequence>
  <element minOccurs="1" maxOccurs="1" name="return_value" type="decimal" />
  </sequence>
  </complexType>
  </element>
  </schema>
  </types>
- <message name="Multiply">
  <part name="parameters" element="tns:Multiply" />
  </message>
- <message name="Multiply_Result">
  <part name="parameters" element="tns:Multiply_Result" />
  </message>
- <portType name="Multiply_Port">
- <operation name="Multiply">
  <input name="Multiply" message="tns:Multiply" />
  <output name="Multiply_Result" message="tns:Multiply_Result" />
  </operation>
  </portType>
- <binding name="Multiply_Binding" type="tns:Multiply_Port">
  <binding transport="http://schemas.xmlsoap.org/soap/http" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
- <operation name="Multiply">
  <operation soapAction="urn:microsoft-dynamics-schemas/codeunit/Multiply:Multiply" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
- <input name="Multiply">
  <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
  </input>
- <output name="Multiply_Result">
  <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
  </output>
  </operation>
  </binding>
- <service name="Multiply">
- <port name="Multiply_Port" binding="tns:Multiply_Binding">
  <address location="http://m6400:7047/DynamicsNAV/WS/CRONUS/Codeunit/Multiply" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" />
  </port>
  </service>
  </definitions>


Bedeutet also, dass ich keine Metadaten bekomme.
Nun habe ich mal im WebBrowser folgendes aufgerufen:

http://m6400:7047/DynamicsNAV

Das Ergbnis ist folgendes:

Code:
Service


Dies ist ein Windows© Communication Foundation-Dienst.

Das Veröffentlichen von Metadaten für diesen Dienst ist derzeit deaktiviert.

Wenn Sie Zugriff auf den Dienst haben, können Sie das Veröffentlichen von Metadaten aktivieren, indem Sie folgende Schritte ausführen, um die Web- oder Anwendungskonfigurationsdatei zu ändern:

1. Erstellen Sie die folgende Dienstverhaltenskonfiguration, oder fügen Sie das <serviceMetadata>-Element einer vorhandenen Dienstverhaltenskonfiguration hinzu:

<behaviors>
    <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
    </serviceBehaviors>
</behaviors>

2. Fügen Sie die Verhaltenskonfiguration folgendem Dienst hinzu:

<service name="MyNamespace.MyServiceType" behaviorConfiguration="MyServiceTypeBehaviors" >

Hinweis: Der Dienstname muss dem Konfigurationsnamen für die Dienstimplementierung entsprechen.

3. Fügen Sie der Dienstkonfiguration den folgenden Endpunkt hinzu:

<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />

Hinweis: Der Dienst muss über eine HTTP-Basisadresse verfügen, um diesen Endpunkt hinzuzufügen.

Im Folgenden finden Sie ein Beispiel für eine Dienstkonfigurationsdatei mit aktivierter Veröffentlichung von Metadaten:

<configuration>
    <system.serviceModel>
 
        <services>
            <!-- Hinweis: Der Dienstname muss dem Konfigurationsnamen für die Dienstimplementierung entsprechen. -->
            <service name="MyNamespace.MyServiceType" behaviorConfiguration="MyServiceTypeBehaviors" >
                <!-- Fügen Sie folgenden Endpunkt hinzu.  -->
                <!-- Hinweis: Der Dienst muss über eine HTTP-Basisadresse verfügen, um diesen Endpunkt hinzuzufügen. -->
                <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
            </service>
        </services>
 
        <behaviors>
            <serviceBehaviors>
                <behavior name="MyServiceTypeBehaviors" >
                    <!-- Fügen Sie der Dienstverhaltenskonfiguration folgendes Element hinzu. -->
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
 
    </system.serviceModel>
</configuration>

Weitere Informationen zum Veröffentlichen von Metadaten finden Sie in der folgenden Dokumentation: http://go.microsoft.com/fwlink/?LinkId=65455.


Ich muss also die Metadaten irgendwie veröffentlichen. Ne Beschreibung ist ja schon dabei aber mein Problem ist nun:

WO WIRD DIESE DATEI ABGELEGT? Was ist das "root" Verzeichnis des WebServices

Das erinnert mich ein wenig an die Anbindung von Silverlight an NAV. Da ist man um diese crossdomain.xml auch nicht herumgekommen.

Kennt jemand eine Lösung?