我们已经继承了一个WCF Web服务,该服务具有自定义MessageFormatter,该自定义MessageFormatter在SerializeReply方法中构造了一个自定义Message子类。使用.NET 3.0中的自定义消息/格式化程序将安全头文件转换为WCF服务
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;
}
}
我们面临的问题是自定义消息子类没有任何标头填充。我们试图了解WCF是否会填充通用的(MessageID,ResponseTo,Action等),但没有运气。然后,我们意识到,自定义消息子类已经实现的标题属性是这样的...
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头(实际上,我们只是试图将时间戳ID和创建/过期元素放在安全头中)。每次我们在Security头中添加Security头时,服务在序列化过程中(在SerializeReply调用完成后)都意外地丢弃了连接。
所以这是我的问题。有谁知道如何通过自定义格式化程序和自定义消息实现将WS-Security头文件转换为WCF服务?
更新[2008年11月26日]:我们拥有一支优秀的MS事件,这和我们从他们那里得到了最新的更新是WCF目前MessageVersion的似乎并不支持这些标题和需要自定义绑定实现。调查继续寻求更好的方法。
你解决了吗? – Junto 2010-06-24 09:06:36
对不起,我从来没有回过头,但MS回来给我们提供了一个涉及编写自定义传输子类的解决方案,因为当前的WSE实现无法处理这些WS_Security标头。 :S – dexterous 2010-07-20 09:41:18