2008-09-23 24 views
0

我們已經繼承了一個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的似乎並不支持這些標題和需要自定義綁定實現。調查繼續尋求更好的方法。

+0

你解決了嗎? – Junto 2010-06-24 09:06:36

+0

對不起,我從來沒有回過頭,但MS回來給我們提供了一個涉及編寫自定義傳輸子類的解決方案,因爲當前的WSE實現無法處理這些WS_Security標頭。 :S – dexterous 2010-07-20 09:41:18

回答

1

我注意到MessageHeaders類有一個constructor,它將一組MessageHeaders作爲參數。也許你可以傳遞你需要的完整的標題集合,看看它是否有效。我之前沒有使用WS-Security標頭,所以我不確定這對他們是否可行。我知道他們將在他們自己的名稱空間(wsse:http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd)中,這將需要爲消息頭定義。

我發現這個article,它給出了消息傳遞基礎知識的一個很好的概述。它有一個創建標題的例子。

相關問題