2009-03-13 6 views
20

J'ai rencontré un problème lors de l'appel du service Web sur un bus SAP PI à partir de mon client WCF. L'opération est définie comme unidirectionnelle et la méthode de mon contrat d'opération proxy est décorée en conséquence lorsque la référence de service est ajoutée. Cependant, le client de service reçoit une exception lors de l'appel de l'opération selon:Problème avec l'appel unidirectionnel du client WCF

L'opération à sens unique retourné un message non nul avec Action = « »

En utilisant SoapUI, la méthode sur la Le bus peut être appelé avec succès et renvoie une enveloppe SOAP avec un corps vide. Les gens de bus m'a dit, c'est selon les spécifications SOAP:


(spécifications SOAP, chapitre 4.7.9, les opérations à sens unique):

Il y a différentes interprétations de la façon dont HTTP est d'être utilisé lors d'opérations à sens unique.

R2714 Pour les opérations à sens unique, une INSTANCE NE DOIT PAS retourner une réponse HTTP qui contient une enveloppe. Plus précisément, le corps d'entité de réponse HTTP doit être vide.

R2750 UN CONSOMMATEUR DOIT ignorer une enveloppe transportée dans un message de réponse HTTP dans une opération unidirectionnelle. Pour les opérations unidirectionnelles, un CONSOMMATEUR NE DOIT PAS interpréter un code d'état de réponse HTTP réussi (c'est-à-dire, 2xx) pour signifier que le message est valide ou que le destinataire le traiterait.


Il semble donc que mon client WCF ne soit pas conforme à R2750.

J'ai découvert que lorsque je force le contrat d'opération sur le proxy à être IsOneWay = false, tout fonctionne.

Y at-il quelque chose qui ne va pas dans la façon dont WCF gère les opérations à sens unique ou est-ce que je fais quelque chose de mal (plus probable)? Y at-il autre chose que je devrais faire, il ne semble pas juste de remplacer le client proxy WCF généré.

Merci pour vos suggestions.

+2

Bonne question +1. Je dirais que leur camp n'est pas conforme à R2714 non plus. S'il vous plaît envisager de déposer un incident avec Microsoft et nous faire savoir quel est le résultat. –

+0

Question similaire (et plus d'infos): http://stackoverflow.com/q/4510484/46039 –

+0

Lien vers la spécification SOAP 4.7.9 Opérations à sens unique: http://www.ws-i.org/profiles/basicprofile -1.1.html –

Répondre

11

Il semble que SAP PI envoie de manière incorrecte une enveloppe SOAP vide et que .NET interprète incorrectement cette enveloppe.

Certaines options de this thread:

  • alter le proxy généré et enlever OneWay = true (ou ajouter oneway = false) à la définition de la méthode
  • capture la violation du protocole dans un gestionnaire d'exception et l'ignorer
  • utiliser un WebReference de style 2.0 pour appeler le service
  • appliquer le correctif SAP Note 1459995 - Soap Sender Adapter HTTP 202 et ajoutez & responsecode202 = true à l'URL

Les première et dernière options ont toutes deux fonctionné pour moi. Suite de la discussion sur ce sap.com thread.

+0

Merci pour cela, c'est toujours pertinent pour moi. –

+0

Ceci est la réponse, merci pour l'aide! – SDeezy

+0

Je pense que d'un point de vue système, un appel de service Web doit toujours répondre avec une confirmation. Vrai ou faux, 1 ou 0 pour indiquer que votre message a été reçu et traité de l'autre côté. –

4

Je consulterais également cet article de Gerben van Loon here. Une opération à sens unique pourrait ne pas être à sens unique selon les normes.

+0

Merci pour ce lien –

+1

La sémantique des appels web oneway sur 'SOAP' est comparable à' void() 'pas fire-and forget. Tout comme une méthode qui renvoie 'void()' l'invocation bloque et a la capacité de "renvoyer" une exception. –

0

Je crois que ce problème particulier peut être résolu en ajoutant la déclaration d'attribut suivant à l'opération dans le porxy client:

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

+0

Merci pour votre réponse. Cependant, ajouter ceci au proxy client généré revient à peu près à définir la propriété OneWay sur false. Et malheureusement, cela n'a pas fonctionné. –

0

Sans voir ce que la signature de la méthode ressemble, ma meilleure estimation est-ce votre méthode définie pour retourner quelque chose d'autre que "vide". Puisque l'opération est unidirectionnelle, la méthode ne peut être définie qu'en utilisant "void" (sans retour). Rien d'autre, et l'opération n'est pas à sens unique.

+0

La méthode retourne effectivement vide –

1

Vérifiez ce SAP enfilez pour la discussion complète: http://scn.sap.com/thread/1627368

Low a répondu @ Brian cette question correctement et très bien (est devrait se marqué comme la réponse).

Je voudrais également ajouter qu'il s'agit d'une erreur connue dans laquelle l'adaptateur SOAP n'est pas conforme au profil de base WS-I 1.1 (R2750) susmentionné et WCF n'est pas conforme à (R2750). Le résultat ... Des heures de temps perdu et des dents à grincer ....

Questions connexes