Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 序列化消息头时出现WCF问题_.net_Wcf_Serialization_Datacontract - Fatal编程技术网

.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
而不是消息契约?我很乐意按照你的建议试试,你有什么我可以看的参考资料吗?