2009-08-20 3 views
1

У меня есть следующий код:WCF Проблема Сериализация заголовок сообщения

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); 
} 

Когда я пытаюсь выполнить сервер после того, как я запустить приведенный выше код, я получаю следующее сообщение об ошибке:

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.

В настоящее время UserSettings описывает SystemContext как тип IDictionary. Я понимаю, что WCF не может волшебным образом создавать объекты из воздуха или что-то еще, поэтому мне нужно немного помочь.

Есть ли какой-то способ, которым я могу передать тип времени выполнения по проводу, а также преобразовать его обратно в этот тип с другой стороны. Я не использую WCF для java для. NET SOA или что-то в этом роде, я знаю, что конкретный тип будет на другой стороне провода.

Если WCF на самом деле не поддерживает это (должен быть какой-то способ), есть способ, которым я мог бы сериализовать данные в двоичном формате, присоединить двоичный файл к заголовку и обработать сериализацию самостоятельно, используя информацию о типе Я перехожу.

+0

Почему вы используете 'MessageHeader.CreateHeader' вместо контракта с сообщением? –

+0

Я был бы рад попробовать, как вы предложили, есть ли у вас какие-либо ссылки, на которые я мог бы обратить внимание? –

ответ

1

Вы можете попробовать применять атрибут knownType к вашему договору услуг, например:

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

И да, в то время как менее изящно, вы можете использовать BinaryFormatter чтобы сериализовать объект заголовка в байты [] массив, вставьте в заголовок, а затем де-сериализуйте с другой стороны. Двоичная сериализация сложна, когда дело доходит до версий, поэтому вы должны быть немного осторожны.