我们继承了一个WCF Web服务,该服务具有自定义MessageFormatter,可在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); }
}
}
... lotta帮助原来是!所以我们重写了它......
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似乎不支持这些标头并且需要定制绑定实现。继续进行调查以获得更好的方法。
答案 0 :(得分:1)
我注意到MessageHeaders类有一个constructor,它将MessageHeaders的集合作为参数。也许您可以传递完整的标题集合,以查看它是否有效。我之前没有使用过WS-Security标头,所以我不确定这对他们是否可行。我知道他们将在他们自己的命名空间(wsse:http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd)中,需要为邮件头定义。
我发现这个article可以很好地概述Messaging Fundamentals。它有一个创建标题的例子。