Laden...

ExtensionDataObject; erweiterung des Webservice

Erstellt von Animal21 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.784 Views
A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 10 Jahren
ExtensionDataObject; erweiterung des Webservice

Hallo Leute,

ich nutze einen WebService, der bei uns auf dem Server im Keller läuft.
Eine Klasse DataField implementiert das IExtensibleDataObject:

    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="DataField", Namespace="NamespaceXYZ")]
    [System.SerializableAttribute()]
public partial class DataField : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {...}

Wenn ich das richtig verstanden habe, kann ich mittels des Interfaces nun die DataField-Klasse um eine gewünschte Property "ForeignKey" erweitern:


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField : IExtensibleDataObject {
    [DataMember)]
    public string FK { get; set; }

    public ExtensionDataObject ExtensionData { get; set; }
}

Aber vermutliche habe ich die nutzung des ganzen nicht richtig verstanden oder angewendet, wenn wenn ich nun ein DataField anlege, ist darin nur der ForeignKey und das ExtensionDataObject enthalten und nicht die restlichen Properties ebenfalls...

folgende Links habe ich genutzt:
Dynamic -VAR
IExtensibleDataObject-Schnittstelle

MfG
Ani

D
30 Beiträge seit 2013
vor 10 Jahren

Also erst mal hast du nur zwei Eigenschaften implementiert, d.h. es gibt keine anderen Eigenschaften. Schnittstellen geben eben nur die Definition vor und wenn du nicht in einen Compilerfehler rennst hast du die Schnittstelle richtig implementiert. Ich würde denken das du deine Klasse von einer anderen ableiten wolltest, denn wenn du ableitest werden auch Eigenschaften übernommen.

Gruß Der_Blob

16.828 Beiträge seit 2008
vor 10 Jahren

Der_Blob, ich denke Du kennst oder verstehst die IExtensibleDataObject Schnittstelle nicht...

IExtensibleDataObject will als Datamembers - meine ich - Felder und keine Eigenschaften- obwohl diese public sind.
Du hast aber eine Eigenschaft.

Wie das bei Dir aussehen muss wäre in Version 1:

[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField : IExtensibleDataObject {
     [DataMember]
     public string FK;

    private ExtensionDataObject data;

    public virtual ExtensionDataObject ExtensionData
    {
        get { return data; }
        set { data = value; }
    }

 } 

Und in Version 2 dann

[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField : IExtensibleDataObject {
     [DataMember]
     public string FK;
     [DataMember]
     public string NeuesFeld1;

    private ExtensionDataObject data;

    public virtual ExtensionDataObject ExtensionData
    {
        get { return data; }
        set { data = value; }
    }

 } 
A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 10 Jahren

@Abt Danke für die Antwort.

Die Klasse DataField wird bereits von dem WebService implementiert und existiert (praktisch Version 1)

Nun möchte ich gern eine Version 2, indem ein ForeignKey (FK) Feld dazukommt.

Dazu muss ich doch eigentlich nur folgendes schreiben:


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField : IExtensibleDataObject {
    [DataMember]
    public string fk;
    private ExtensionDataObject data;

    public ExtensionDataObject ExtensionData {
        get { return data; }
        set { data = value; }
    }
}

Aber beim erstellen eines DataField sehe ich nun nur das .fk field und die ExtensionData Property.
Eigentlich müsste ich doch aber alle Properties von Version 1 plus mein fk sehen, oder?

gruß
ani

16.828 Beiträge seit 2008
vor 10 Jahren

Es müssen ALLE Felder von Version 1 beibehalten werden - daher auch mein Beispiel.

Variante 1:

[DataMember]
public string Name;

Variante 2:

[DataMember]
public string Name;
[DataMember]
public string Vorname;

Variante 3:

[DataMember]
public string Name;
[DataMember]
public string Vorname;
[DataMember]
public DateTime Geburtstag;
A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 10 Jahren

OK, hab ich soweit verstanden und scheint auch soweit zu klappen, aber es hat sich noch ein weiteres Problem ergeben, evtl. könnt ihr mir da aber garnicht helfen.

Ich habe ein Objekt A, welches ein Array besagter Klasse DataField beinhaltet.
Wenn ich nun meine neue Liste mit der erweiterten Version DataField2 erstellt habe und an Object A hänge, funktioniert noch alles wunderbar.

Wenn ich im Debug-Modus mir nun die Liste ansehen, ist der "ForeignKey" mit einem roten Ausrufezeichen versehen mit der Beschreibung: "ForeignKey = Die Funktionsauswertung wurde abgebrochen." (An dieser Stelle steht normalerweise der zugewiesene Wert)

Weiterhin, bekomme ich, wenn ich das Objekt per Webservice übermittle eine StackOverflowException.

grüße
Ani

PS: Habe die Klasse wie folgt erweitert:


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField2 : DataField{
    [DataMember]
    public string fk;
    Public string FK{ get; set; }
}

Wenn ich wie folgt erweitere, kann ich meine Version2 Liste nicht der Liste von Objekt A zuweisen (da ja keine Verbindung existiert)


[DataContract(Name = "DataField", Namespace = "NamespaceXYZ")]
class DataField2 : IExtensibleDataObject{
    [DataMember]
    public string fk;
    Public string FK{ get; set; }
 
    //Alle Properties und Attribute vom Original übernommen
}

16.828 Beiträge seit 2008
vor 10 Jahren

Könnte sein, dass der Speicher Case-Insensetive ist und Du daher FK und fk nicht mischen darfst.

A
Animal21 Themenstarter:in
144 Beiträge seit 2008
vor 10 Jahren

Leider auch nicht, verschiedene Benennung führt zu den selben Fehlern.

Edit: ok hab meinen Fehler gefunden hatte eine endlod-scheife erzeugt -_-'

folgender Fehler taucht nun auf.

Kann mir einer die Hinweise erklären, die vom Compiler geworfen werden?

Fehlermeldung:
Fehler beim Deserialisieren von Parameter http://www.qpulse.com/QPulseWebServices/v1.2/:newOccurrence. Die InnerException-Nachricht war "Der Typ 'DataField2' mit dem Datenvertragsnamen 'Occurrence: http://www.qpulse.com/QPulseWebServices/v1.2/' wird nicht erwartet. Verwenden Sie ggf. einen DataContractResolver, oder fügen Sie alle unbekannten Typen statisch der Liste der bekannten Typen hinzu, beispielsweise mithilfe des KnownTypeAttribute-Attributs oder indem Sie sie zur Liste der bekannten Typen hinzufügen, die an DataContractSerializer übergeben wird.". Weitere Details finden Sie unter "InnerException".

Server stack trace:
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart (XmlDictionaryWriter writer, PartInfo part, Object graph)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameter (XmlDictionaryWriter writer, PartInfo part, Object graph)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameters (XmlDictionaryWriter writer, PartInfo[] parts, Object[] parameters)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeBody (XmlDictionaryWriter writer, MessageVersion version, String action, MessageDescription messageDescription, Object returnValue, Object[] parameters, Boolean isRequest)
bei System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents (XmlDictionaryWriter writer, MessageVersion version, Object[] parameters, Object returnValue, Boolean isRequest)
bei System.ServiceModel.Dispatcher.OperationFormatter. OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.BodyWriter.WriteBodyContents (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.Message.OnWriteMessage (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.Message.WriteMessage (XmlDictionaryWriter writer)
bei System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage (Message message, BufferManager bufferManager, Int32 initialOffset, Int32 maxSizeQuota)
bei System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage (Message message, Int32 maxMessageSize, BufferManager bufferManager, Int32 messageOffset)
bei System.ServiceModel.Channels.MessageEncoder.WriteMessage (Message message, Int32 maxMessageSize, BufferManager bufferManager)
bei System.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage (Message message)
bei System.ServiceModel.Channels.HttpOutput.Send (TimeSpan timeout)
bei System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest (Message message, TimeSpan timeout)
bei System.ServiceModel.Channels.RequestChannel.Request (Message message, TimeSpan timeout)
bei System.ServiceModel.Dispatcher.RequestChannelBinder.Request (Message message, TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.Call (String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannel.Call (String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, ProxyOperationRuntime operation)
bei System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage message)

Exception rethrown at [0]:
bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg)
bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData& msgData, Int32 type)
bei QPulse_01.QPulseWebServices.Occurrence.IOccurrence.CreateNewOccurrence (CreateNewOccurrenceRequest request)
bei QPulse_01.QPulseWebServices.Occurrence.OccurrenceClient.CreateNewOccurrence (CreateNewOccurrenceRequest request) in .........\Reference.cs:Zeile 3363.
bei Programm.Main (String[] argv) in .........:Zeile 150.

++++++++++++++++++++++++++++++

InnerException:

Der Typ 'DataField2' mit dem Datenvertragsnamen 'Occurrence: ht****tp://www.qpulse.com/QPulseWebServices/v1.2/' wird nicht erwartet. Verwenden Sie ggf. einen DataContractResolver, oder fügen Sie alle unbekannten Typen statisch der Liste der bekannten Typen hinzu, beispielsweise mithilfe des KnownTypeAttribute-Attributs oder indem Sie sie zur Liste der bekannten Typen hinzufügen, die an DataContractSerializer übergeben wird.
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType (XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize (XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
bei WriteArrayOfDataFieldToXml (XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract )
bei System.Runtime.Serialization.CollectionDataContract.WriteXmlValue (XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize (XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerializeReference (XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle)
bei WriteOccurrenceToXml (XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract )
bei System.Runtime.Serialization.ClassDataContract.WriteXmlValue (XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle)
bei System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent (XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
bei System.Runtime.Serialization.DataContractSerializer.InternalWriteObject (XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
bei System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions (XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)
bei System.Runtime.Serialization.XmlObjectSerializer.WriteObject (XmlDictionaryWriter writer, Object graph)
bei System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart (XmlDictionaryWriter writer, PartInfo part, Object graph)

16.828 Beiträge seit 2008
vor 10 Jahren

An der (Basis)Klasse fehlt das KnownType-Attribut - steht aber auch in der Fehlermeldung.