1

我有以下代码:

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为 type IDictionary。我知道 WCF 不能凭空创造物体,所以我需要一点帮助。

有什么方法可以让我也可以通过网络传递对象的运行时类型,并将其转换回另一端的那种类型。我没有将 WCF 用于 java 到 .net SOA 的东西或类似的东西,我知道具体类型将在电线的另一端。

如果 WCF 并不真正支持这一点(但必须有某种方式),有没有办法可以将数据序列化为二进制格式,将二进制文件附加到标头并自己处理序列化,使用我传递的类型信息。

4

1 回答 1

1

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

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

是的,虽然它不太优雅,但您可以使用 BinaryFormatter 将您的标头对象序列化为 byte[] 数组,将其粘贴在标头中,然后在另一侧反序列化。二进制序列化在版本控制方面很棘手,因此您必须小心。

于 2009-08-20T23:33:16.243 回答