Получение заголовков безопасности в службу WCF с помощью настраиваемого сообщения / форматера в .NET 3.0 - PullRequest
0 голосов
/ 23 сентября 2008

Мы унаследовали веб-службу WCF, у которой есть собственный MessageFormatter, который создает собственный подкласс Message в методе SerializeReply.

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 с помощью специального средства форматирования и пользовательской реализации сообщений?

Обновление [26 ноября 2008] : у нас есть выдающийся инцидент MS для этого, и последнее обновление, которое мы получили от них, заключалось в том, что нынешние MessageVersion WCF, похоже, не поддерживают эти заголовки и нуждаются в пользовательском связывании реализация. Расследование продолжается для лучших подходов.

1 Ответ

1 голос
/ 26 сентября 2008

Я заметил, что класс MessageHeaders имеет конструктор , который принимает коллекцию MessageHeaders в качестве параметра. Может быть, вы могли бы передать полную коллекцию заголовков, которые вам нужны, чтобы увидеть, работает ли он. Я раньше не работал с заголовками WS-Security, поэтому не уверен, что это возможно для них. Я знаю, что они будут в своем собственном пространстве имен (wsse: http://docs.oasis -open.org / wss / 2004/01 / oasis-200401-wss-wssecurity-secext-1.0.xsd ), которое потребуется определяется для заголовка сообщения.

Я нашел эту статью , которая дает хороший обзор Основ обмена сообщениями. У него есть пример создания заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...