![](/img/trans.png)
[英]WCF Service - certificates and message security with UserName authentication
[英]Getting Security Headers into a WCF service with custom message/formatter in .NET 3.0
我们继承了具有自定义MessageFormatter的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); }
}
}
...事实证明是洛塔的帮助! 所以我们照原样重写了它...
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调用完成之后)都意外断开了连接。
所以这是我的问题。 有谁知道如何通过自定义格式化程序和自定义消息实现将WS-Security标头放入WCF服务中?
更新[2008年11月26日] :为此,我们遇到了一个严重的MS事件,从他们那里得到的最新更新是WCF的当前MessageVersion似乎不支持这些标头,并且需要自定义绑定实现。 继续调查以寻求更好的方法。
我注意到MessageHeaders类具有一个构造函数 ,该构造函数将MessageHeaders的集合作为参数。 也许您可以传递标头的完整集合,以查看其是否有效。 我之前没有使用过WS-Security标头,因此不确定它们是否可行。 我知道它们将位于自己的命名空间(wsse: http : //docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd )中为消息头定义的。
我发现这篇文章很好地概述了邮件基础知识。 它有一个创建标头的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.