使用.NET 3.0中的自定义消息/格式化程序将安全标头添加到WCF服务中

时间:2008-09-23 07:01:11

标签: .net asp.net wcf web-services soap

我们继承了一个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似乎不支持这些标头并且需要定制绑定实现。继续进行调查以获得更好的方法。

1 个答案:

答案 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。它有一个创建标题的例子。