2010-12-30 8 views
1

Ich habe mehrere Serviceverträge über WCF ausgesetzt, die mehrere Datenverträge verwenden. Der Dienst soll von Adobe Flex genutzt werden. Ich bin auf viele Probleme gestoßen, die Flex veranlassen, die WSDL zu verbrauchen, die vom Bediener produziert wird. Ich habe die Prozedur here verwendet, um die WSDL in eine einzige Datei zu komprimieren (ich habe FlatWsdl und nicht WcfExtras verwendet, wenn es darauf ankommt).WCF: Sollen alle Datenkontrakte denselben Namespace verwenden?

Jetzt eine Reihe von Fehlern immer ich bin, wenn VS2010 eigenes wsdl.exe Tool meiner Metadaten zu extrahieren. Genauer gesagt, erhalte ich folgende Fehler:

1) Schema validation warning: Schema item 'complexType' named 
    'ArrayOfKeyValueOfSomeKeySomeValuep1alXzIb' from namespace 
    'http://schemas.microsoft.com/2003/10/Serialization/Arrays' is invalid. 
    Namespace 'http://My/Wcf/Namespace' is not available to be referenced 
    in this schema. 

2) Schema validation warning: Schema item 'complexType' named 'MyComplexType' 
    from namespace 'http://My/Wcf/Namespace' is invalid. Namespace 
    'http://schemas.datacontract.org/2004/07/My.Real.Namespace' is not available 
    to be referenced in this schema. 

nun das Wörterbuch („ArrayOfKeyValueOf ...“) Typ anscheinend in einem externen Schema definiert ist, die nicht durch meine WSDL importiert wird. Bitte beachten Sie, dass SomeKey und SomeValue einen Datenkontrakt-Namespace von My/Wcf/Namespace haben.

Wie bei MyComplexType ist die seltsame Sache, dass, wenn ich seinen Datacontract-Namespace in denselben Namespace ändern, der von meinen Diensten, Servern und Bindungen verwendet wird, dann geht der Fehler (2) weg. Ich kann nicht herausfinden warum.

Was kocht bitte ich auf zwei Fragen nach unten:

1) Wie kann ich eine Import-Direktive von einem externen Schema meiner WSDL hinzufügen? Ich sah online einige Lösungen, die das Schreiben einer Wrapper-Klasse um die Container vorschlugen. Dies möchte ich wirklich vermeiden.

2) Muss ich wirklich alle meine Datacontracts in einem einzigen Namensraum setzen? Ich habe keinen technischen Einwand dagegen, es zu tun, aber es wird sehr mühsam sein, den Namensraum aller Datenverträge zu ändern. Vielleicht gibt es einen automatisierten Weg, dies zu erreichen?

TIA!

+0

Dies wird Ihre Frage nicht beantworten, aber wenn diese Dienste nur für den Verbrauch mit Adobe Flex konzipiert sind, würde ich dringend empfehlen, von WebServices zu wechseln und zu einem AMF-Protokoll mit WebORB oder FlourineFX zu wechseln. Haben Sie darüber hinaus ein Tool wie ServiceCapture verwendet, um herauszufinden, welche Daten hin und her gesendet werden? Was ist der youf Flex-Code für die Nutzung der Dienste? – JeffryHouser

+0

Ich nehme an, das ist ein Weg, aber es wird ein bisschen ein Re-Design sein. Sie sehen, die Services sollten ursprünglich mit C# konsumiert werden, und erst kürzlich haben wir den Umstieg auf Flex vorgenommen.Außerdem möchten wir unsere Dienste in einer standardisierten Weise offen legen, damit Drittentwickler mit ihnen interagieren können. – telewin

+0

Ich habe kein Capturing-Tool verwendet. Was erwartest du dort zu sehen? Ich weiß, wie die WSDL aussieht, und wsdl.exe behauptet, es sei kaputt. Glauben Sie, dass durch das Schnüffeln des Drahtes weitere Erkenntnisse gewonnen werden können? Wie wir die Services in flex konsumieren: Wir wollten die "Webservice Introspection" -Funktion von Flex nutzen. Mit anderen Worten - wir wollen die Dienste als einfache Webdienste nutzen. – telewin

Antwort

0

Also nur für den Fall jemand anderes das gleiche Problem läuft in mit einem WCF (Basichttpbinding) Server von einem Flex-Client Zugriff auf:

1) Nein, alle Datacontracts nicht im gleichen Namensraum sein müssen (aber alle Servicecontracts, Service-Implementierungen und Bindungen tun müssen im selben Namespace sein!).

2) Der Kern des Problems ist, dass Flex erwartet, dass jedes xsd: schema einen "xsd: import namespace" für alle Namespaces hat, auf die es verweist. Dieser Import soll die folgende Form hat:

<xsd:import namespace="http://schemas.datacontract.org/2004/07/SomeNamespace" /> 

Es scheint nicht ein Weg, dies zu tun mit WCF zu sein, da es automatisch ein automatisch generierte schema Attribut zu diesem Tag fügt, die Flex zu holen macht versuchen Diese schemaLocation. Die einzige Problemumgehung scheint die manuelle Manipulation der WSDL auf der XML-Ebene zu sein (z. B. durch Aussetzen eines REST-Endpunkts zum Abrufen der Metadaten).

Dank Yaron Naveh in den MSDN-WCF-Foren für seine Hilfe. Die Diskussion findet sich unter http://social.msdn.microsoft.com/Forums/en/wcf/thread/b9429e30-e4d5-454f-9fbd-bae39990ff33.

+0

Beim Versuch, einen WCF-SOAP-Dienst von Flex zu verwenden, ist ein ähnliches Problem aufgetreten. Könnten Sie Ihre Antwort ein wenig klären? Wollen Sie sagen, dass das bloße Vorhandensein des Attributs "schemaLocation" bei diesen Importen dazu führt, dass Flex bricht? Wie würde es die referenzierten Schemas ohne es finden? –

+0

@ Matti: in der Tat, das SchemaLocation von WCF hinzugefügt bricht Flex. Das Problem ist, dass alles bereits in die WSDL eingebettet ist (Sie müssen eine "flache WSDL" verwenden), so dass Sie nicht auf ein externes Schema verweisen müssen. Schließlich haben wir ein kleines Programm geschrieben, um die WSDL für uns zu modifizieren (modifiziere die Importe). – telewin

+0

@ Matti: um auf die "ändern die Importe" oben zu klären: was wir tun, ist für jedes Schema in der '' Knoten, fügen wir einen Import für alle anderen Schemas sowie 'http://schemas.microsoft.com/2003/10/Serialisierung/',' http: // schemas.microsoft.com/2003/10/Serialisierung/Arrays' und 'http: // schemas.datacontract.org/2004/07/System'. Für jedes Systemschema (d.h. ein Schema, das 'http: // schemas.datacontract.org/2004/07/System' enthält) fügen wir einen Import von 'http: // schemas.microsoft.com/2003/10/Serialization' hinzu. – telewin

Verwandte Themen