WCF问题序列化消息标题

时间:2009-08-20 23:19:22

标签: .net wcf serialization datacontract

我有以下代码:

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

当我运行上面的代码后尝试执行服务器时,出现以下错误:

  

预计不会输入数据合约名称为“UserAcountDetials:http://schemas.datacontract.org/2004/07/ACSIS.Core.Common.Configuration”的'ACSIS.Core.Common.Configuration.UserAcountDetials'。将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

现在UserSettingsSystemContext描述为IDictionary类型。据我所知,WCF无法凭空创造任何神奇的东西,所以我需要帮助它。

是否有某些方法可以通过线路传递运行时类型的对象,并将其转换回另一侧的该类型。我没有使用WCF for java to .net SOA的东西或类似的东西,我知道具体类型将在电线的另一端。

如果WCF不支持这个(虽然必须有一些方法),有没有办法我可以将数据序列化为二进制格式,将二进制文件附加到标题并自己处理序列化,使用类型信息I穿过。

1 个答案:

答案 0 :(得分:1)

您可以尝试将knownType属性应用于服务合同,如下所示:

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

是的,虽然它不那么优雅,但你可以使用BinaryFormatter将你的头对象序列化为byte []数组,将其粘贴在头文件中,然后在另一端反序列化。在版本控制方面,二进制序列化很棘手,所以你必须要小心。