2010-08-18 2 views
1

Je configure un service WCF très simple dont le seul travail consiste à recevoir un message XML via SOAP et à envoyer le message à un service interne. Disons que celui que je crée est un poste de garde de tel. (noms réels ont été substitués par exemple)Réception XML simple dans le service WCF .NET

information initiale:

  1. Je ne peux pas changer le service externe appelant moi. Pour autant que je sache, c'est un client Soap11 construit en Java.

  2. Tous les noms ont été remplacés par des noms factices dans cet exemple.

Endpoint-setup:

<service behaviorConfiguration="GuardpostBehavior" name="Guardpost.ContractImplementation"> 
    <endpoint address="" binding="basicHttpBinding" contract="Guardpost.IContract" bindingConfiguration="basic"> 
    <identity> 
     <dns value="localhost"/> 
    </identity> 
    </endpoint> 
    </service> 

configuration Reliure:

<basicHttpBinding> 
    <binding name="basic" textEncoding="utf-8" messageEncoding="Text"> 
    <security mode="Transport" /> 
    </binding> 
</basicHttpBinding> 

(j'ai besoin Transport-sécurité en raison de https)

Mon contrat ressemble à ceci:

[ServiceContract] 
public interface IContract 
{ 
    [OperationContract(Action="urn:#GuardpostReceive")] 
    void GuardpostReceive(string inputXml); 
} 

Maintenant, ce que je reçois est un message enveloppé de savon dont l'action est définie sur urn: #GuardpostReceive, de sorte que le routage réel du message est effectué correctement.

Cependant - Lorsque le message est reçu, il est pas réellement poussé dans la méthode à cause de cette erreur:

OperationFormatter encountered an Invalid Message body. Expected to find node type 'Element' with name 'inputXml' and namespace ' http://tempuri.org/ '. Found node type 'Element' with name 'extns:ExternalNodeName' and namespace ' http://foo.com/bar.org/someservice/schema/1 '

Le problème semble être que mon WCF service est incapable d'extraire le corps du message de savon et simplement le passer en langage XML, mais c'est ce que j'ai besoin de faire.

Ai-je rencontré un showstopper en WCF?

Répondre

2

Vous pouvez définir un contrat pour recevoir l'intégralité du message SOAP et ignorer le routage entièrement:

[ServiceContract] 
public interface IUniversalRequestReply 
{ 
    [OperationContract(Action = "*", ReplyAction = "*")] 
    Message ProcessMessage(Message msg); 
} 

[ServiceContract] 
public interface IUniversalOneWay 
{ 
    [OperationContract(Action = "*", IsOneWay=true)] 
    void ProcessMessage(Message msg); 
} 

Mais je pense que vous ne seriez pas en mesure de faire quelque chose comme:

[ServiceContract] 
public interface IContract 
{ 
    [OperationContract(Action="urn:#GuardpostReceive")] 
    void GuardpostReceive(Message inputXml); 
} 

Qu'est-ce que essayez-vous d'accomplir dans la mise en œuvre réelle de l'opération?

0

Si vous définissez le paramètre en tant que chaîne, vous devez passer le codage XML - comme & lt; element/& gt ;. Si vous avez besoin de passer un XML non codé, essayez d'utiliser XmlElement ou XElement en tant que paramètre.

+0

Le problème ici n'est pas la chaîne ou le type de paramètre d'entrée, mais l'exception OperationFormatter. Cela arrive peu importe ce que je définis comme inputtype. –

+0

Désolé ma faute, j'ai sauté le paragraphe initial de votre question. Si vous construisez un routeur, vous devriez travailler directement avec le type de message (le type d'opération de retour doit également être Message). Vous ne pouvez pas simplement définir un paramètre de chaîne et espérer qu'il sera rempli avec XML. Vous pouvez également essayer d'utiliser XmlElement ou XElement en tant que type de paramètre. Alex vous a déjà montré un exemple. –

Questions connexes