2012-03-23 8 views
5

ich einen WCF-Dienst erstellt und an den Standard-Service habe ich eine weitere Operation Vertrag über die wichtigsten Datacontract:Betrieb nicht in der WCF-Testclient unterstützt

[OperationContract] 
void DoSomething(UserData data); 

Dann habe ich so etwas wie dieses (vereinfacht zum Zweck der Beispiel) unten. Das Problem ist, dass obwohl ALLE Klassen in der Hierarchie mit DataContract dekoriert sind und ALLE ihre Mitglieder mit DataMember dekoriert sind, wenn ich den WCF Test Client benutze, ein rotes Icon zeigt, dass "der Vorgang im WCF Test Client nicht unterstützt wird".

+1

ich zwei Klassen mit dem gleichen Namen, aber man den Verbundtyp fehlt, was Sie damit meinen Sie? Sie haben auch vergessen, die Klasse des zusammengesetzten Typs zu buchen. – Silvermind

+0

Ich sehe Sie sprechen über Hierarchie. Implementieren Sie irgendeine rekursive Beziehung? Da dies die rekursive Verwendung der Klasse erfordern würde, die mit '[DataContract (IsReference = True)]' – Silvermind

+0

@Silvermind sorry typo error versehen wurde, war der zweite (bereits korrigierte) CompositeType und nicht UserData. Ich habe auch den IsReference-Parameter zu den Subtypen hinzugefügt, die im Hauptdatenkontrakt verwendet werden, aber das Problem wurde dadurch nicht gelöst. –

Antwort

4

Fügen Sie das Attribut zu Ihrem 'Userdata' Klasse [KnownType(typeof(CompositeType))]

Like:

[DataContract] 
[KnownType(typeof(CompositeType))] 
public class UserData 
{ 
    [DataMember] 
    public uint One { get; set; } 

    [DataMember] 
    public CompositeType Extra { get; set; } 

    public UserData() { ctor. code } 
} 

http://msdn.microsoft.com/en-us/library/ms730167.aspx

Edit:

http://msdn.microsoft.com/en-us/library/system.operatingsystem.aspx

Die Operatingklasse ein einige Eigenschaften, die sich auf andere Klassen beziehen. Sie könnten alle diese Klassen in die bekannten Typen einschließen, aber die Abhängigkeitskette könnte ziemlich groß werden, und ich würde sehr empfehlen, die Betriebssystemklasse überhaupt nicht zu verwenden.

Sie sollten herausfinden, welche Informationen Sie tatsächlich von der Betriebssystemklasse benötigen, und ein eigenes DTO erstellen, das in der Antwort zurückgegeben wird. Auf diese Weise können Sie sicherstellen, dass alle Typen auf Ihrem Vertrag leicht definiert werden können.

+0

Ich habe die KnownType-Dekoration zum übergeordneten Typ hinzugefügt, um die Typen der benutzerdefinierten Klassen anzugeben, die in den Rückgabewerten der DataMembers verwendet werden, und die gleichen für die unter Hierarchie, im Grunde ist alles, was kein nativer Typ ist, mit [KnownType] gekennzeichnet der Datenkontrakt Das Problem besteht immer noch. –

+0

@LordofScripts können Sie ein Beispielprojekt erstellen und es irgendwo hochladen, damit ich (und andere) einen Blick darauf werfen können. – Phill

+0

Dies ist der ISampleService.cs –

0

Funktioniert der Dienst, wenn Sie einen Testclient (wie eine Konsolenanwendung) erstellen und eine Dienstreferenz zu der WCF hinzufügen? Wenn dies der Fall ist, hat Ihr Datenvertrag wahrscheinlich einen dieser Typen, die vom WCF Test-Client nicht unterstützt werden.

See this related issue

+0

Die URL, die ich in diesem verwandten Problem sehe, ist vom Typ .../Name.svc, während der WCF Test Client mir die folgende URL zeigt: http: // localhost: 8731/Design_Time_Adressen/My.WebServices/RegistrationService/mex Wenn ich es auf IE verwende, zeigt es überhaupt nichts. –

0

Die WCF Standard-Erwartung für einen Service-Aufruf ist Request-Response - WCF erwartet eine Art von Antwort zurück.

Wenn Sie void verwenden mögen (wie in: kein Rückgabewert), müssen Sie diese Methoden mit

[OperationContract(IsOneWay = true)] 
void DoSomething(UserData data); 

schmücken die WCF-Laufzeit erzählen keinen Rückgabewert aus dem Aufruf zu erwarten

Weitere Informationen über WCF: Working with One-Way Calls, Callbacks and Events finden Sie hier im MSDN Magazine.

+0

Ich habe nie die 'IsOneWay == true' für normale Bindungen in einem WCF-Vertrag benötigt, ist es nicht besser für die DualBinding geeignet, da der Dual-Channel eine unabhängige Antwort an den Client senden kann? – Silvermind

+0

Sie müssen nicht IsOneWay = true festlegen, und Sie sollten beachten, dass der Client keine Fehlerausnahmen erhält, die vom Server ausgelöst werden, da er nicht auf die ungültige Antwort wartet, die der WCF-Dienst zurückgibt damit Fehlerausnahmen zurückgegeben werden können. –

+0

Das hat auch nichts getan, dasselbe Problem. Mein Betriebsvertrag hat einen einzelnen Parameter eines Typs, den ich definiert habe und der mit DataContract markiert ist. Dieser benutzerdefinierte Typ verfügt über mehrere Eigenschaften, die mit DataMember markiert sind. Dabei handelt es sich jeweils um einen benutzerdefinierten (aber eher einfachen) Typ, wobei alle diese Subtypen in ihrer Deklaration als DataContract gekennzeichnet sind. –

5

OK, durch die ganze Sache gegangen (Dank an alle für die Tipps) war die Lösung dieses:

  • IsReference Attribut in Datacontract wurde nicht bei allen
  • benötigt IsOneWay Attribut in Datacontract nicht benötigt wurde überhaupt, auch wenn OperationContract zurückkehrte.
  • KnownType wurde auch nicht benötigt, vorausgesetzt, alle Untertypen in der Hierarchie waren meine, also von mir definiert.NET und markiert mit DataContract oder DataMember als geeignet
  • Loswerden von OperatingSystem und Erstellen eines Wrappers DataContract, die die notwendigen Informationen aus dem OperatingSystem extrahiert wurde um das Problem.

Jetzt gibt es keine Fehler in der WCF-Testclient

+1

Hi stecken mit einem ähnlichen Problem. Was genau meinen Sie mit "Das Betriebssystem loswerden und einen Wrapper DataContract erstellen, der die notwendigen Informationen aus dem Betriebssystem extrahiert hat, um das Problem." – Neeraj

+0

Stuck auf diesem auch, könnten wir ein Update bekommen? – Feign

Verwandte Themen