2008-09-23 5 views
0

Nous avons hérité d'un service Web WCF qui a un MessageFormatter personnalisé qui construit une sous-classe Message personnalisée dans la méthode SerializeReply.Obtention d'en-têtes de sécurité dans un service WCF avec message personnalisé/formateur dans .NET 3.0

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; 
    } 

} 

Le problème auquel nous sommes confrontés est que la sous-classe de message personnalisée n'a aucun en-tête rempli. Nous avons essayé de voir si WCF peuplerait les génériques (MessageID, ResponseTo, Action et autres) hors de la boîte, mais pas de chance. Ensuite, nous avons réalisé que la sous-classe personnalisée du message a mis en œuvre la propriété en-têtes comme si ...

class OurMessage : Message 
{ 
    public override MessageHeaders Headers 
    { 
    get { return new MessageHeaders(MessageVersion.Soap11WSAddressing10); } 
    } 
} 

... Lotta aide qui se est avéré être! Donc, nous l'avons réécrit comme si ...

class OurMessage : Message 
{ 
    MessageHeaders headers; 

    public OurMessage() 
    { 
    // ... 

    headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10); 
    } 

    public override MessageHeaders Headers 
    { 
    get { return headers; } 
    } 
} 

... et toujours pas de chance.

Nous avons donc commencé à coder à la main les en-têtes; d'abord dans le Formatter ...

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; 
    } 

} 

... puis dans le message lui-même ...

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; 
    } 
    } 
} 

Chaque façon que nous avons essayé, nous avons réussi à obtenir le WS-Addressing en-têtes dans le réel réponse, mais ne pourrait jamais obtenir l'en-tête WS-Security (en fait, nous essayions simplement de mettre un en-tête de sécurité avec les éléments TimestampID et Created/Expires). Chaque fois que nous avons ajouté l'en-tête Security dans l'en-tête Security, le service a simplement laissé tomber la connexion de manière inattendue pendant la sérialisation (après l'achèvement de l'appel SerializeReply).

Alors, voici ma question. Est-ce que quelqu'un sait comment obtenir les en-têtes WS-Security dans un service WCF avec Formatter personnalisé et l'implémentation de message personnalisé?

Mise à jour [26 novembre 2008]: Nous avons un incident exceptionnel MS pour cela et la dernière mise à jour, nous avons d'eux était que ne semble pas de courant de WCF MessageVersion pour soutenir les en-têtes et ont besoin d'une mise en œuvre de liaison personnalisée. L'enquête se poursuit pour de meilleures approches.

+0

Avez-vous trouvé la solution? – Junto

+0

Je suis désolé de ne jamais être revenu là-dessus, mais MS nous est revenu avec une solution qui impliquait l'écriture de sous-classes de transport personnalisées car l'implémentation WSE actuelle ne pouvait pas gérer ces en-têtes WS_Security. : S – dexterous

Répondre

1

J'ai remarqué que la classe MessageHeaders a un constructor qui prend une collection de MessageHeaders en tant que paramètre. Peut-être que vous pourriez passer la collection complète des en-têtes dont vous avez besoin de voir si cela fonctionne. Je n'ai pas travaillé avec les en-têtes WS-Security auparavant, donc je ne suis pas sûr que cela soit faisable pour eux. Je sais qu'ils seront dans leur propre espace de noms (wsse: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd) qui devra être défini pour l'en-tête du message.

J'ai trouvé ce article qui donne un bon aperçu des principes de base de la messagerie. Il a un exemple sur la création d'en-têtes.

+0

Vous ne savez pas exactement à quoi vous faites allusion. Nous n'avons aucun en-tête pour commencer, donc je ne peux pas voir le constructeur de copie fonctionner. – dexterous

Questions connexes