.net 序列化消息头时出现WCF问题
我有以下代码:.net 序列化消息头时出现WCF问题,.net,wcf,serialization,datacontract,.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.
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);
}
在运行上述代码后尝试执行服务器时,出现以下错误:
不应使用数据协定名称为“useracountdetals:”的类型“ACSIS.Core.Common.Configuration.useracountdetals”。将任何静态未知的类型添加到已知类型列表中-例如,使用KnownTypeAttribute
属性或将它们添加到传递给DataContractSerializer的已知类型列表中
现在UserSettings
将SystemContext
描述为IDictionary
类型。我知道WCF不能神奇地用稀薄的空气或者其他任何东西来创建对象,所以我需要帮助它
是否有某种方法可以通过连接传递对象的运行时类型,并在另一端将其转换回该类型。我没有使用WCF for java to.NETSOA之类的东西,我知道具体的类型将在另一边
如果WCF真的不支持这一点(一定有办法),有没有办法将数据序列化为二进制格式,将二进制文件附加到标头并使用我传递的类型信息自行处理序列化。您可以尝试将knownType属性应用于服务合同,如下所示:
[ServiceKnownType(typeof(ACSIS.Core.Common.Configuration.UserAcountDetials))]
[ServiceContract]
public interface IMyService
{...
是的,虽然它不那么优雅,但您可以使用BinaryFormatter将标头对象序列化为byte[]数组,将其固定在标头中,然后在另一端反序列化。二进制序列化在版本控制方面很棘手,因此您必须小心一点。您可以尝试将knownType属性应用于服务契约,如下所示:
[ServiceKnownType(typeof(ACSIS.Core.Common.Configuration.UserAcountDetials))]
[ServiceContract]
public interface IMyService
{...
是的,虽然它不那么优雅,但您可以使用BinaryFormatter将标头对象序列化为byte[]数组,将其固定在标头中,然后在另一端反序列化。当涉及到版本控制时,二进制序列化是很棘手的,所以你必须要小心一点。为什么要使用
MessageHeader.CreateHeader
而不是消息契约?我很乐意按照你的建议尝试,你有什么我可以看的参考资料吗?你为什么用MessageHeader.CreateHeader
而不是消息契约?我很乐意按照你的建议试试,你有什么我可以看的参考资料吗?