0

我们继承了具有自定义 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 似乎不支持这些标头,需要自定义绑定实现。调查仍在继续寻找更好的方法。

4

1 回答 1

1

我注意到 MessageHeaders 类有一个构造函数,它将 MessageHeaders 集合作为参数。也许您可以传递您需要查看它是否有效的完整标题集合。我以前没有使用过 WS-Security 标头,所以我不确定这对他们来说是否可行。我知道他们将在自己的命名空间(wsse:http ://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd )中为消息头定义。

我发现这篇文章很好地概述了消息传递基础知识。它有一个关于创建标题的示例。

于 2008-09-25T20:15:50.373 回答