2010-11-12 17 views
0

Je rencontre un problème pour faire fonctionner mon service WCF avec d'autres clients.Comment WCF envelopper les messages de corps XML?

Le ServiceContract ressemble à ceci:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, 
    ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, 
    UriTemplate = "/calculation/{accountNumber}")] 
    string RunCalculations(string returnInformation, string accountNumber); 
} 

J'ai écrit un simple client pour vous assurer que tout fonctionnait, et quand je passe dans le xml que je veux, tout fonctionne à merveille.

Le problème est que le service existe pour exposer une interface de notre produit à un fournisseur tiers, qui développe une interface web en php. Quand il essaie d'émettre la requête, il reçoit une erreur 400 Bad Request, qui, en regardant à travers la trace, est provoquée lorsque WCF essaie d'analyser son xml.

Le message d'erreur que je reçois est:

Unable to deserialize XML body with root name 'BusinessTaxReturn' and root namespace '' (for operation 'RunCalculations' and contract ('IMyService', 'http://tempuri.org/')) using DataContractSerializer. 
Ensure that the type corresponding to the XML is added to the known types collection of the service. 

Je suppose que WCF est enveloppait le message que mon client envoie, puis tenter de le déballer lorsque le service reçoit le message. Cela me laisse avec deux questions:

  1. À quoi WCF enveloppe-t-il les messages XML?
  2. Quelle est la meilleure façon de résoudre ce problème? Devrais-je simplement demander au client d'inclure son message ou devrais-je vraiment essayer d'utiliser un contrat DataContract?

Répondre

0

Pour comprendre cela, utilisez un proxy HTTP Debugging comme Fiddler pour espionner les messages de votre client WCF envoie au serveur WCF et comparer aux messages envoyés par l'application PHP.