Frage

Ich habe einen Service-Vertrag, der eine Methode mit einem Parameter vom Typ System.Object definiert (xs: anyType in der WSDL). Ich möchte in der Lage, einfache Typen sowie komplexe Typen in diesem Parameter zu übergeben. Einfache Typen funktionieren, aber wenn ich versuche, einen komplexen Typen zu übergeben, die in meinem WSDL definiert ist, ich diesen Fehler:

Element ' http://tempuri.org/:value ' enthält Daten des ‚ http://schemas.datacontract.org/2004/07/MyNamespace:MyClass ‘ Datenvertrag. Der Deserializer hat keine Kenntnis von jeglicher Art, die zu diesem Vertrag abbildet. Fügen Sie den Typ entsprechend ‚MyClass‘ in die Liste der bekannten Typen - z. B. durch das Knowntype Attribut oder durch sie in die Liste der bekannten Typen weitergegeben DataContractSerializer Hinzufügen

als bekannte Art Hinzufügen nicht hilft, weil es bereits in meiner WSDL ist. Wie kann ich ein Objekt eines komplexen Typs passieren über eine „xs: anyType“? Parameter

Weitere Informationen:

Ich glaube, das funktioniert, wenn NetDataContract, aber ich kann nicht verwendet werden, dass, weil mein Mandant ist Silverlight.

Ich habe Verweise auf komplexe Typen explizit erstreckt xs gesehen: anyType, aber ich habe keine Ahnung, wie WCF eine WSDL machen erzeugen, die das tut, und ich habe keine Ahnung, ob es würde auch helfen,

.

Danke

War es hilfreich?

Lösung 3

Ich habe dieses Problem gelöst, indem das ServiceKnownType Attribut. Ich füge einfach meinen komplexen Typen als Dienst bekannter Art auf meinem Service-Vertrag, und der Fehler geht weg. Ich bin mir nicht sicher, warum dies nicht das letzte Mal funktionierte ich versuchte es.

Es scheint nicht die WSDL in irgendeiner Weise zu beeinflussen, so dass ich vermute, dass der serialisierten Stream muss eine gewisse Differenz hat, die Deserializer darüber informiert, dass das Objekt deserialisiert werden kann, meine Art verwendet wird.

Andere Tipps

Die NetDataContract funktioniert, weil die NetDataContractSerializer Informationen enthalten geben.

Das Knowntype Attribut weist die DataContractSerializer, wie die Nachricht deserialisieren. Implementierung spezifischer zu sein, ist diese Information über-and-oben, dass durch den öffentlichen Auftrag definiert und gehört nicht in der WSDL.

Sie sind nie alten Datentyp passiert in der Lage sein, weil der Deserializer den entsprechenden Typen identifizieren muss und eine Instanz erstellen.

Unter Umständen können Sie Ihre bekannten Typen zur Laufzeit abzuleiten, anstatt sie in der Datacontract hartcodiert ist. Werfen Sie einen Blick hier für eine Probe.

Ich hoffe, dies würde helfen. Ich sah einen Kollegen von mir diesen Code mit komplizierten Datentypen zu senden und das ist für mich ziemlich einfach. Dies wurde mit Basichttpbinding verwendet und es funktioniert ziemlich gut mit MOSS BDC sowie anderen Anwendungen, die die grundlegenden Bindung verwenden.

  1. einen Datenvertrag erstellen, basierend auf einer generischen Klasse
  2. , um den Datenvertrag verwenden, wenn die Informationen gesendet werden müssen

    [Datacontract (Namespace = " http: //Service.DataContracts ", Name = "ServiceDataContractBase")] public class ServiceDataContract {

    public ServiceDataContract() { }
    
    public ServiceDataContract(TValueType Value)
    {
        this.m_objValue = Value;
    }
    
    private TValueType m_objValue;
    
    [DataMember(IsRequired = true, Name = "Value", Order = 1)]
    public TValueType Value
    {
        get { return m_objValue; }
        set { m_objValue = value; }
    }
    

    }

Mit diesem Datenvertrag, wo immer es in den WCF-Funktionen benötigt wird, den den komplizierten Datentyp zurückgeben. Zum Beispiel:

public ServiceDataContract<string[]> GetStrings()
{
    string[] temp = new string[10];
    return new ServiceDataContract<string[]>(temp);
}

Update: ServiceDataContract ist generische Klasse ist TValueType verwenden. Es wird nicht angezeigt, weil etwas falsch mit der Wiedergabe der HTML.

Verwendung Datenvertrag Surrogates Versuchen nicht unterstütztes Objekt abzubilden, die dot net spezifische oder nicht interoperabel Arten sind. Siehe MSDN

Für den Moment habe ich um diese gearbeitet durch einen neuen Datenvertragstyp zu schaffen, die entweder einen anderen Datenvertragstyp oder eine einfache Art wickeln kann. Anstelle von Typ-Objekt übergeben, habe ich jetzt diese Wrapper-Klasse übergeben. Dies funktioniert OK, aber ich würde immer noch gerne wissen, ob es eine Lösung für das ursprüngliche Problem.

Ich habe versucht, das ServiceKnownType Attribut hinzufügen, den Typen angeben, die ich passieren bin versucht, aber ich immer noch die gleichen Fehler. Ich habe auch versucht, das Knowntype Attribut auf meinen Datenvertrag Zugabe (das schien albern, weil sie vom gleichen Typ wie der Datenvertrag) war. Ich würde vermuten, dass sie zur Laufzeit hinzugefügt wird nicht helfen, wenn sie bei der Kompilierung Zugabe hilft nicht.

Wenn ich eine anderen komplexen Typen ausdehnten, so scheint es mir, dass ich mag das Knowntype Attribut zu diesem Basistyp hinzuzufügen. Aber da meine Basis Typ Object ist, ich sehe keine Möglichkeit, dies zu tun.

Wie für Surrogates, scheint es mir, dass diese für die Verpackung Typen verwendet werden, die definierte keinen Vertrag hat. In meinem Fall jedoch muss ich den Vertrag definiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top