2011-04-21 3 views
0

Je dois prendre des WSDL prédéfinis (je ne les contrôle pas) et les exposer sur notre périphérique pour répondre à diverses requêtes SOAP/UPnP.WCF - Generating Action String

De toute façon, j'ai tout cela fonctionne, mais le problème vient parce que j'ai un service qui pourrait être demandé sur un certain nombre de canaux. Je vais vous expliquer:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:1", ConfigurationName="myInterface")] 
public interface myInterface 
{ 
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:1#GetConfiguration", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")] 
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request); 
} 

Fondamentalement, ce que j'essaie de faire (je me rends compte de cette syntaxe est tout à fait tort, mais je pense que ça va passer le message) est la suivante:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:{channelNumber}", ConfigurationName="myInterface")] 
public interface myInterface 
{ 
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:{channelNumber}#GetConfiguration", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")] 
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request, String channelNumber); 
} 

I J'aimerais simplement qu'une partie de mon message d'action original soit transmise en tant que paramètre à la méthode que j'implémente. La seule autre façon dont j'ai pensé que je pourrais implémenter ceci, serait de spécifier une autre méthode, nous l'appellerons Dispatcher avec l'Action = "*", puis analyser manuellement l'action reçue en utilisant OperationContext.Current.IncomingMessageHeaders.Action. Cela semble juste une façon vraiment ombreuse de faire les choses. Je suis certain que le principal obstacle ici est mon inexpérience avec la WCF.

Toute aide que vous pourriez fournir serait grandement appréciée.

Merci,

Répondre

0

La meilleure façon de gérer est de créer un gestionnaire de message générique. Le contrat ressemblerait à quelque chose comme ceci:

[ServiceContract(SessionMode = SessionMode.Allowed)] 
public interface ICatchAll 
{ 
    [OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")] 
    Message ProcessMessage(Message message); 
} 

L'idée est que vous créez une méthode « routeur » pour votre service along the lines of this article. Vous aurez toujours besoin de créer les contrats de services individuels de canal pour former le message de savon à recevoir & a été renvoyé, mais le point de terminaison client est envoyé à votre point de terminaison de service "routeur". Vous pouvez peut-être faire quelque chose dans ce sens avec le nouveau service de routage WCF 4 si vous créez une instance distincte de chaque contrat de service de canal.

+0

Merci pour le commentaire Sixto. Comme vous le verrez bientôt, je commence toujours avec ce genre de choses.Je peux peut-être restructurer ma question pour obtenir un type de solution différent. Je n'ai pas vraiment de problème à modifier les fichiers d'interface générés par SVCUtil.exe, mais je pourrais avoir plus de 128 canaux différents venant de divers clients UPnP, et coder tous ceux à la main pour les 3 ou 4 services serait énorme. –

0

La seule méthode de généralisation de l'action est le caractère générique * et elle est généralement utilisée avec les entrées et les sorties Message génériques.

Il existe un moyen de personnaliser l'ensemble du comportement de la sélection de l'opération et de la définition et du remplissage des paramètres. Vous pouvez vérifier les interfaces suivantes:

  • IDispatchOperationSelector est utilisé pour sélectionner le fonctionnement à partir des données incomming
  • IOperationInvoker permet d'affecter des paramètres et invoquer l'opération sélectionnée par IDispatchOperationSelector
  • IDispatchMessageFormatter est utilisé pour remplir les paramètres de l'opération aux emplacements d'allocation préparés par IOperationInvoker

Vous n'avez probablement pas besoin de tous les implémenter mais ils vous permettront de personnaliser le beha vior de toute façon dont vous avez besoin. Par exemple, pour le sélecteur personnalisé et le formateur, cochez la case MSDN samples, par exemple, de l'invocateur personnalisé, this article. Quoi qu'il en soit, tout ce codage d'infrastructure déplacera simplement votre analyse syntaxique Action vers certains composants internes de WCF, mais vous devrez tout de même faire cela pour l'obtenir en tant que paramètre d'opération.

+0

Cela ressemble plus à ce que je cherchais, et je pense que ça va finalement me trouver une solution. Je n'aurai pas l'occasion de l'essayer avant demain, mais je mettrai aussi à jour le SO à ce moment-là. Très apprécié est votre aide. =) –

Questions connexes