Мы унаследовали веб-службу 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, похоже, не поддерживают эти заголовки и нуждаются в пользовательском связывании реализация. Расследование продолжается для лучших подходов.