我有以下代码:
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的已知类型列表中。
现在UserSettings
将SystemContext
描述为IDictionary
类型。据我所知,WCF无法凭空创造任何神奇的东西,所以我需要帮助它。
是否有某些方法可以通过线路传递运行时类型的对象,并将其转换回另一侧的该类型。我没有使用WCF for java to .net SOA的东西或类似的东西,我知道具体类型将在电线的另一端。
如果WCF不支持这个(虽然必须有一些方法),有没有办法我可以将数据序列化为二进制格式,将二进制文件附加到标题并自己处理序列化,使用类型信息I穿过。
答案 0 :(得分:1)
您可以尝试将knownType属性应用于服务合同,如下所示:
[ServiceKnownType(typeof(ACSIS.Core.Common.Configuration.UserAcountDetials))]
[ServiceContract]
public interface IMyService
{...
是的,虽然它不那么优雅,但你可以使用BinaryFormatter将你的头对象序列化为byte []数组,将其粘贴在头文件中,然后在另一端反序列化。在版本控制方面,二进制序列化很棘手,所以你必须要小心。