我们继承了具有自定义 MessageFormatter 的 WCF Web 服务,该服务在 SerializeReply 方法中构造自定义 Message 子类。
class OurMessageFormatter : MessageFormatter
{
public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
{
OurResponse ourResponse = (OurResponse) result;
// some validation here...
OurMessage reply = new OurMessage(ourResponse, MessageVersion.Soap11);
return reply;
}
}
我们面临的问题是自定义 Message 子类不会填充任何标题。我们试图查看 WCF 是否会开箱即用地填充通用的(MessageID、ResponseTo、Action 等),但没有运气。然后我们意识到自定义 Message 子类已经实现了 Headers 属性,就像这样......
class OurMessage : Message
{
public override MessageHeaders Headers
{
get { return new MessageHeaders(MessageVersion.Soap11WSAddressing10); }
}
}
......原来是很多帮助!所以我们把它改写成这样......
class OurMessage : Message
{
MessageHeaders headers;
public OurMessage()
{
// ...
headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10);
}
public override MessageHeaders Headers
{
get { return headers; }
}
}
......仍然没有运气。
所以我们继续对标题进行手动编码;首先在格式化程序中...
class OurMessageFormatter : MessageFormatter
{
public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
{
//...
OurMessage reply = new OurMessage(ourResponse, MessageVersion.Soap11);
ourMessage.MessageID = ...;
ourMessage.ResponseTo = ...;
ourMessage.Action = ...;
// more headers set ...
return reply;
}
}
...然后在消息本身中...
class OurMessage : Message
{
public override MessageHeaders Headers
{
get
{
MessageHeaders headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10);
ourMessage.MessageID = ...;
ourMessage.ResponseTo = ...;
ourMessage.Action = ...;
// more headers set ...
return headers;
}
}
}
我们尝试的每一种方式,我们都设法将 WS-Addressing 标头放入实际响应中,但永远无法获得 WS-Security 标头(实际上我们只是试图放入带有 TimestampID 和 Created/Expires 元素的安全标头)。每次我们在 Security 标头中添加 Security 标头时,服务都会在序列化期间意外断开连接(在 SerializeReply 调用完成之后)。
所以这是我的问题。有谁知道如何使用自定义 Formatter 和自定义 Message 实现将 WS-Security 标头放入 WCF 服务?
更新 [2008 年 11 月 26 日]:我们有一个突出的 MS 事件,我们从他们那里得到的最新更新是 WCF 的当前 MessageVersion 似乎不支持这些标头,需要自定义绑定实现。调查仍在继续寻找更好的方法。