如何通过WCF中的标头传输对象

时间:2010-03-31 09:04:28

标签: wcf c#-4.0

我正在尝试通过邮件检查程序在邮件标题中传输一些用户信息。

我创建了一个将检查器添加到服务(客户端和服务器)的行为。

但是当我尝试与服务进行通信时,我收到以下错误:

XmlException:
名称不能以'<'开头字符,十六进制值0x3C。

我也得到异常告诉我DataContracts意外的地方。

  

类型   'System.DelegateSerializationHolder + DelegateEntry'   与数据合同名称   'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System'   不是预期的。考虑使用   DataContractResolver或添加任何类型   静态地不知道列表   已知类型 - 例如,通过使用   KnownTypeAttribute属性或   将它们添加到已知类型列表中   传递给DataContractSerializer。

问题是我的对象包含其他标记为DataContract的对象,我不想为这些类型添加KnownType属性。

另一个问题可能是我的序列化对象在内部类和内部属性等方面受到很大限制。

任何人都可以指导我朝着正确的方向前进。我做错了什么?

一些代码:

public virtual object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    var header = MessageHeader.CreateHeader("<name>", "<namespace>", object);
    request.Headers.Add(header);

    return Guid.NewGuid();
}

2 个答案:

答案 0 :(得分:1)

请勿将尖括号放入实际的琴弦中。请记住,序列化格式甚至可能不是基于文本的,您所做的只是指定元素的名称和命名空间。所以你的代码应该更像这样:

 var header = MessageHeader.CreateHeader("name", "urn:myNamespace", object); 
 request.Headers.Add(header); 

答案 1 :(得分:0)

要结束这个问题,我从未解决过这个例外。相反,我实现了ISerializable,它对我很有用。