我們已經繼承了一個WCF Web服務,該服務具有自定義MessageFormatter,該自定義MessageFormatter在SerializeReply方法中構造了一個自定義Message子類。使用.NET 3.0中的自定義消息/格式化程序將安全頭文件轉換爲WCF服務
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;
}
}
我們面臨的問題是自定義消息子類沒有任何標頭填充。我們試圖瞭解WCF是否會填充通用的(MessageID,ResponseTo,Action等),但沒有運氣。然後,我們意識到,自定義消息子類已經實現的標題屬性是這樣的...
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頭(實際上,我們只是試圖將時間戳ID和創建/過期元素放在安全頭中)。每次我們在Security頭中添加Security頭時,服務在序列化過程中(在SerializeReply調用完成後)都意外地丟棄了連接。
所以這是我的問題。有誰知道如何通過自定義格式化程序和自定義消息實現將WS-Security頭文件轉換爲WCF服務?
更新[2008年11月26日]:我們擁有一支優秀的MS事件,這和我們從他們那裏得到了最新的更新是WCF目前MessageVersion的似乎並不支持這些標題和需要自定義綁定實現。調查繼續尋求更好的方法。
你解決了嗎? – Junto 2010-06-24 09:06:36
對不起,我從來沒有回過頭,但MS回來給我們提供了一個涉及編寫自定義傳輸子類的解決方案,因爲當前的WSE實現無法處理這些WS_Security標頭。 :S – dexterous 2010-07-20 09:41:18