2009-08-20 6 views
1

Ich habe den folgenden Code:WCF Problem Serialisierung eine Message Header

public virtual void Initialise() 
{ 
    this.AddHeader("SystemContext", this.UserSettings.SystemContext); 
} 

public virtual void AddHeader(string key, object value) 
{ 
    var customHeader = MessageHeader.CreateHeader(key, this.SystemSettings.SystemServiceNamespace, value); 
    OperationContext.Current.OutgoingMessageHeaders.Add(customHeader); 
} 

Wenn ich versuche, und führen Sie den Server, nachdem ich den obigen Code ausgeführt haben, bekomme ich folgende Fehlermeldung:

Type 'ACSIS.Core.Common.Configuration.UserAcountDetials' with data contract name 'UserAcountDetials: http://schemas.datacontract.org/2004/07/ACSIS.Core.Common.Configuration ' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

Nun beschreibt UserSettingsSystemContext als vom Typ IDictionary. Ich verstehe, dass WCF keine magischen Objekte aus der Luft schaffen kann oder so, also muss ich etwas helfen.

Gibt es eine Möglichkeit, dass ich den Laufzeittyp des Objekts auch über die Leitung übergeben und auf der anderen Seite in diesen Typ konvertieren kann. Ich benutze WCF nicht für Java zu .net SOA Zeug oder etwas ähnliches, ich weiß, dass der konkrete Typ auf der anderen Seite der Leitung sein wird.

Wenn WCF dies nicht wirklich unterstützt (es muss doch einen Weg geben), gibt es eine Möglichkeit, die Daten in ein Binärformat zu serialisieren, die Binärdatei an die Kopfzeile anzuhängen und die Serialisierung mithilfe der Typinformationen selbst zu handhaben Ich gehe rüber.

+0

Warum verwenden Sie 'MessageHeader.CreateHeader' anstelle eines Nachrichtenvertrags? –

+0

Ich würde gerne versuchen, wie Sie vorgeschlagen haben, haben Sie irgendwelche Referenzen, die ich betrachten könnte? –

Antwort

1

Sie könnten versuchen, die Knowntype Attribut auf Ihrem Servicevertrag Anwendung, wie folgt aus:

[ServiceKnownType(typeof(ACSIS.Core.Common.Configuration.UserAcountDetials))] 
[ServiceContract] 
public interface IMyService 
{... 

Und ja, während es weniger elegant ist, könnten Sie die BinaryFormatter verwenden Ihre Header-Objekt in ein Byte-Serialisierung [] Array, stecken Sie das in der Kopfzeile, dann auf der anderen Seite deserialisieren. Binäre Serialisierung ist schwierig, wenn es um Versionierung geht, also müssen Sie ein wenig vorsichtig sein.

Verwandte Themen