C# web-service-client: mehrere web-service-Methoden mit gleichen (komplexen) zurück geben?
Ich bin chipping entfernt an Gebäude, ein client für Java-B2B-web-service im moment, und ich glaube, ich haben festgestellt, dass die Ursache für ein problem wir haben haben schon seit einiger Zeit. Leider bin ich nicht zum posten der WSDL.
Anscheinend ist mein auto-generierte proxy-code (via wsdl.exe: verwenden WSE 3.0 aufgrund der WCF nicht unterstützt Kennwort-digest) ist nicht in der Lage zum verarbeiten des web-service WSDL, die mehrere web-Methoden mit dem gleichen komplexen Rückgabetyp.
Nehmen Sie zum Beispiel eine web-service definiert die folgenden Methoden:
Public ComplexTypeX Blah();
Public ComplexTypeX Blue();
Public ComplexTypeX Foo();
Public ComplexTypeY Bar();
In meine Referenz.cs-Datei, wenn ich kommentiere alle code fordert, dass zwei beliebige Blabla(), Blau (Blue) oder Foo(), dann die übrigen unkommentiert Methode kann aufgerufen werden, kein problem. Allerdings, wenn ich mehr als eine dieser drei Methoden, die nicht auskommentiert sind (sagen, Blah() und Foo()), dann bekomme ich die folgende Fehlermeldung auf Instanziierung der web-service-client-code:
Methode"Bla kann nicht reflektiert werden."
"Das XML-element 'ComplexTypeX' aus
namespace ' http://some.url " Referenzen
eine Methode und ein Typ. Ändern Sie die
Methode die den Namen der Nachricht mit
WebMethodAttribute oder ändern Sie die
geben Sie das root-element mit dem
XmlRootAttribute."
Nun, es ist definitiv keine ComplexTypeX
Methode definiert, die als Teil des web-service, so kann ich nur annehmen, dass .NET (oder zumindest wsdl.exe) können Sie nicht verwenden ein web-service, gibt komplexe (Benutzer-definiert) - Typen des gleichen Typs über mehrere Methoden ... richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief in ein ähnliches problem, und hier ist was ich gefunden habe:
Hatte ich definiert einen komplexen Typ zurück als Antwort:
Beachten Sie, dass hier die exakten Namen der Paarung von Foo/Foo+Reaktion ist wichtig. Wenn ich änderte den Namen der Methode, wie folgt, das problem ging Weg:
Was ich glaube, was passiert ist .NET versucht, automatisch wickeln Sie die Antwort aus dem kommenden Foo-Methode mit einem element mit dem Namen FooResponse. Die Verwendung von gleichen Namen wie das Objekt, das Sie zurückgeben möchten, schafft Unklarheit. Versuchen Sie, die Namen Ihrer response-Objekt, oder der name der Methode dies zu vermeiden Kollision.
Ich gerade gesucht "verweist auf eine Methode und eine Art" und fand eine Verbindung bug-report "System.InvalidOperationException: Das XML-element * aus dem namespace * Referenzen Referenzen eine Methode und eine Art". In diesem Fall, es ist eine operation und ein element mit dem exakt gleichen Namen (lokale Namen und namespace).
Ist es erwähnenswert, ein Teil der Antwort von Microsoft:
Fand ich ein weiterer Fall, erhöhen Sie den Fehler! Hier ist mein code:
Ok, lassen Sie mich erklären: der return-Typ
CheckUpdateResponse
ist eine Struktur,CheckUpdate()
ist die Methode. Also, in der WSDL .NET hinzufügen, die automatisch eine "Response
" - suffix zu den Namen der MethodeCheckUpdate
in einem XML-element zu beschreiben, der return-Wert der Methode.Et voilà: es fand ein doppeltes element, und geben Sie den Fehler "Ändern der Methode den Namen der Nachricht mit WebMethodAttribute..."
Lösung? Umbenannt habe ich den return-Typ "CheckUpdateResult" und jetzt funktioniert auch alles!
Ich hoffe das hilft jemandem!
Dies ist falsch. Vorstellen, wie viel von einem Schmerz, dass es sein würde, wenn es wahr wäre - Sie konnte immer nur eine Methode, die einen String zurückgibt, gibt eine Doppel -, eine, gibt SomeObject, etc... es wäre ein Alptraum.
Ich bin nicht sehr vertraut mit web-services in .NET, aber aus den Fehlern, die Sie bekommen es klingt, als ob du Probleme mit den XML-namespaces - vielleicht gibt es einen Namenskonflikt. Ich würde versuchen, den Vorschlag Folgen, in der Fehlermeldung, ändern Sie die
WebMethodAttribute
.Darüber hinaus auch, wenn Sie nicht auf der post, ein Stück code/Dokument-bezogen auf die Probleme, die Sie haben, weil einige Unternehmen Datenschutz/Empfindlichkeit Probleme haben, sollten Sie veröffentlichen eine bereinigte version, die noch beweist, dass Ihre test-Fall. Fast alles, was "sensibel" sollte in der Lage sein werden, eingekocht auf eine weit einfachere code-snippet, das noch bekommt Ihre Nummer auf, ohne zu verraten irgendwelche Empfindlichkeiten.
Sehr seltsam. Normalerweise wird die WSDL-eine häufige Art, und bei der Kompilierung durch wsdl.exe oder svcutil.exe Sie würden sich einen gemeinsamen, gemeinsamen Art zu verwenden, über eine beliebige Anzahl von Methoden, die in der gleichen Schnittstelle.
Gab es Probleme beim Verweis auf mehrere unabhängige WSDL-s in der gleichen app, die das teilen einer angeblich identischen Art, die Ergebnisse in zwei unterschiedlichen CLR-Typen generiert wird. Es gibt Möglichkeiten, um dieses problem - es ist ziemlich gut bekannt. Dann gibt es die etwas problem im Zusammenhang mit der Zuordnung einer vorhandenen business-Objekt für einen Typ erzeugt aus einem WSDL. Andere zuvor erforscht Landschaft.
Aber Sie reden über etwas anderes.
Verwenden WSDL.exe hat einen Schalter /sharetypes. Dieser sollte sich darum kümmern, das Problem.
Außerdem würde ich nicht damit einverstanden, dass seine eine Microsoft Sache, wie die gleichen Klassen ausgesetzt sind, als unterschiedlich komplexe Typen sitzen in mehreren wsdl. Das ist nicht gut abstrahiert design.
Bereit Referenz-Dokumentation von Microsoft für sharetypes
Leuchtet auf, geben Sie die sharing-Funktion. Diese Funktion erstellt eine code-Datei mit einem einzigen Typ-definition für identische Typen, die gemeinsam von verschiedenen Diensten (namespace, name und Draht-Signatur muss identisch sein). Bezug der Dienste mit http://- URLs als Kommandozeilen-Parameter oder erstellen Sie eine discomap-Dokument für lokale Dateien.