Проблема WCF, сериализующая заголовок сообщения - PullRequest
1 голос
/ 21 августа 2009

У меня есть следующий код:

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

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

Введите 'ACSIS.Core.Common.Configuration.UserAcountDetials' с именем контракта данных 'UserAcountDetials: http://schemas.datacontract.org/2004/07/ACSIS.Core.Common.Configuration' не ожидается. Добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer.

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

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

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

1 Ответ

1 голос
/ 21 августа 2009

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

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

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

...