2008-09-23 18 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,它给出了消息传递基础知识的一个很好的概述。它有一个创建标题的例子。

相关问题