web-dev-qa-db-de.com

WCF: Wie wird ein einzelnes WSDL-Dokument ohne WSDL: Import generiert?

Ich habe Probleme mit einem Problem ... Ich versuche, eine Möglichkeit zu finden, ein einzelnes WSDL-Dokument aus meinem WCF-Dienst zu generieren, d. H. Ohne Verknüpfung zu externen Dokumenten. Ich habe FlatWsdl verwendet, um alle xsd: import-Links zu entfernen, aber meine generierte wsdl enthält immer noch einen Link zu einem externen wsdl-Dokument über eine wsdl: import-Deklaration:

<wsdl:import namespace="http://myurl/mynamespace"  
             location="http://myserver/myservice.svc?wsdl=wsdl0"/>  

Dieses Dokument enthält tatsächlich alle eingebauten xsd-Schemata. Gibt es also eine Möglichkeit, auch dieses externe wsdl-Dokument einzubinden, um eine einzige wsdl zu haben?

Vielen Dank für jede Hilfe.

22
D_Guidi

(BEARBEITEN: Vorherige Antwort zu FlatWSDL wurde gelöscht, da Sie darauf hingewiesen haben, dass xsd: import nicht wsdl: import entfernt wurde.)

Schau dir diesen Blogpost an: Kontrollierte generierte WSDL in WCF

"... Es wird immer eine WSDL für einen URI des Zielnamensbereichs generiert ..."

Haben Sie einen anderen Namespace für ServiceContract, DataContract, ServiceBehavior usw.?

13
Vizu

Sie können dies nun nativ in .net 4.5 (Beta) durchführen. Es gibt eine Option (? SingleWsdl statt? Wsdl), die den Dienst anweist, alles in einem einzigen wsdl-Dokument auszugeben. Weitere Informationen zum neuen Material finden Sie hier: http://msdn.Microsoft.com/en-us/library/dd456789(v=vs.110).aspx

19
Irwin

Sie können auch das WCFExtras-Projekt verwenden, das über eine Erweiterung verfügt, um eine einzelne WSDL-Datei zu erstellen.

WCFExtras

Eine Sammlung nützlicher WCF-Erweiterungen , Einschließlich Unterstützung für Soap Header, WSDL Dokumentation und mehr.

Die WCF-Plattform ist sehr erweiterbar Und ermöglicht das einfache Hinzufügen von Funktionen , Die nicht zum Kernprodukt. Gehören. Dieses Projekt enthält einige Erweiterungen , Die ich in ein WCF-Projekt: 

  • SOAP-Header-Unterstützung für WCF Hinzufügen von WSDL
  • Dokumentation aus XML-Quellcode-Kommentaren
  • Überschreiben Sie SOAP Adressspeicherort-URL
  • Einzelne WSDL-Datei für bessere Kompatibilität mit älteren SOAP-Tools.

http://wcfextras.codeplex.com/

4
Jochen

mein Problem bestand in Endpunktdefinitionen, die sich in tempuri.org-Namespace befinden. Das Hinzufügen von bindingNamespace zu Endpunktdeklarationen behebt mein Problem. Danke an alle für die Hilfe :)

2
D_Guidi

Dies ist eine späte Antwort, aber ich hatte das gleiche Problem mit einigen unserer WCF-Dienste. Wenn Sie mit .NET 4.5 arbeiten, verwenden Sie wie in der vorherigen Antwort? SingleWSDL. Wenn Sie sich jedoch nicht auf .NET 4.5 konzentrieren, fügte ich meiner web.config Folgendes hinzu, um das Problem zu beheben ...

<useRequestHeadersForMetadataAddress>
  <defaultPorts>
    <add port="80" scheme="http" />
    <add port="443" scheme="https" />
  </defaultPorts>
</useRequestHeadersForMetadataAddress>

Das hängt mit Ihrem Verhalten zusammen. Auf diese Weise musste ich die WSDL nicht abflachen, da alle Verweise auf MyURL statt auf MyServer lauteten.

Hoffe, das hilft anderen bei einem ähnlichen Problem.

1
Jim

Sie müssen zusätzliche Verhaltensweisen usw. hinzufügen.

Sehen Sie diese Artikel hier:

http://my-tech-talk.blogspot.com/2008/07/adding-flatwsdl-to-wcf-webservice.html

http://blogs.thinktecture.com/cweyer/archive/2007/05/10/414840.aspx

Es gibt verschiedene Möglichkeiten, dies zu erreichen.

Marc

1
marc_s

Wenn Sie zusätzlich zu Jims Antwort oben C # -Code verwenden, um einen WCF ServiceHost direkt zu konfigurieren:

using System.ServiceModel.Configuration;

und beim Einrichten Ihres ServiceHost:

UseRequestHeadersForMetadataAddressBehavior urh = new UseRequestHeadersForMetadataAddressBehavior();
serviceHost.Description.Behaviors.Add(urh);

Ich hatte Mühe, diese Informationen online zu finden, so einfach wie sie sind. Hoffentlich hilft jemand in einer ähnlichen Situation.

0
James Heliker