2010-10-03 3 views
3

J'essaye d'écrire une application C# pour recevoir des notifications d'eBay qui sont envoyées comme SOAP sur HTTP. Je reçois les notifications correctement mais je ne peux pas les faire passer à mon service WCF. Que dois-je faire sur la configuration du service WCF pour permettre à la demande SOAP entrante d'être reconnue? J'utilise un webHttpBinding avec le service WCF.Obtenir WCF pour reconnaître la requête SOAP entrante

La requête SOAP est:

POST /paypal/ebaynotification.svc HTTP/1.0 
Host: myserver.com 
Content-Type: text/xml;charset=utf-8 
SOAPAction: "http://developer.ebay.com/notification/ItemListed" 
Content-Length: 6610 
X-Original-Client: 10.71.29.83 
Via: 1.0 sjcproxy10b:8081 (squid) 
Cache-Control: max-age=86400 
Connection: keep-alive 

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Header> 
    <ebl:RequesterCredentials soapenv:mustUnderstand="0" xmlns:ns="urn:ebay:apis:eBLBaseComponents" xmlns:ebl="urn:ebay:apis:eBLBaseComponents"> 
    <ebl:NotificationSignature xmlns:ebl="urn:ebay:apis:eBLBaseComponents">RnvpyFAXc9Duo0W+/Mk68g==</ebl:NotificationSignature> 
    </ebl:RequesterCredentials> 
</soapenv:Header> 
<soapenv:Body> 
     .... 
    </soapenv:Body> 
    </soapenv:Envelope> 

Mon interface de service WCF est:

[ServiceContract(Namespace="http://developer.ebay.com/notification")] 
public interface Iebaynotification 
{ 
    [OperationContract] 
    void ItemListed(ItemType item); 
} 

Répondre

2

Vous avez besoin quelque chose à "attraper" cette demande SOAP entrant et faites tourner la classe WCF pour y faire face. Vous pouvez avoir un service WCF auto-hébergé (par exemple dans un service Windows NT) à l'écoute sur une URL de point de terminaison donnée, ou vous pouvez avoir une activation basée sur des messages, comme IIS/WAS qui interceptera un message entrant et passez-le à la WCF pour la manipulation. Donc, fondamentalement, vous devez implémenter ce contrat de service dans une classe de service WCF, puis vous devez héberger/déployer ce service WCF de manière à ce que le message entrant soit traité par lui.

Mais le plus important: puisqu'il est un message SOAP, vous ne pouvez pas utilisation webHttpBinding qui est la liaison utilisé pour les services WCF REST. Vous devrez utiliser quelque chose comme basicHttpBinding ou wsHttpBinding.

+0

La liaison BasicHttp ou Custom avec le transport HTTP et l'encodage des messages texte avec la version de message définie sur SOAP 1.1 est nécessaire. Cela ne fonctionnera pas avec WSHttpBinding. –

0

Si eBay expose un point de terminaison SOAP, j'imagine qu'il a publié un document WSDL décrivant le service de rappel. Vous pouvez utiliser l'outil de ligne de commande svcutil.exe pour générer une interface WCF/C# correcte que vous devez implémenter dans votre implémentation de service pour gérer le message SOAP que vous décrivez. Consultez la documentation de l'API d'eBay ...

+0

eBay a un point de terminaison SOAP et même un exemple de SDK pour s'y connecter, donc je n'ai aucun problème là-bas. Mon problème est l'inverse d'obtenir un point de terminaison WCF SOAP pour accepter une demande de la fin d'eBay. – sipwiz

+0

Je suppose que eBay a fourni un WSDL pour le service de rappel dans leur SDK - avez-vous cherché et essayé de créer un contrat WCF avec svcutil.exe? – larsw

+0

Oui, je l'ai cherché et non ce n'est pas là. Si c'était le cas, je n'aurais pas eu besoin de poster cette question. – sipwiz

Questions connexes