2009-07-31 5 views
1

Je développe un service WCF et s'il y a une erreur je veux sérialiser le paramètre entrant de la méthode originale qui a été appelée sur le service. J'utilise IErrorHandler pour attraper toutes les exceptions. Mes pensées initiales étaient que je vais stocker le paramètre sérialisé dans OperationContext.IncomingMessageProperties afin que je puisse y accéder à partir de la méthode HandleError. Cependant, comme ceci n'est pas exécuté sur le thread d'origine, je pense que le OperationContext sera nul, donc j'examine l'accès à partir de la méthode ProvideFault.WCF OperationContext

Est-ce que cela semble faisable? Et cela fonctionnera-t-il avec les appels de service OneWay?

+0

Comment faire quoi? Je pense que cela pourrait être la question la plus vague que j'ai vu sur SO encore. –

+0

Haha, ressemble à un accident (rapide sur le bouton soumettre). CAn vous éditez avec 1 point? – flq

Répondre

2

Pas sûr que je peux vraiment vous aider beaucoup ici, mais je vais essayer:

sur votre client, votre code appelle essentiellement une méthode et transmet des paramètres. La pile WCF du côté client convertit ensuite cela en un message SOAP (généralement avec un corps XML, mais peut également être binaire) avec des en-têtes et tout, puis envoie ce message à travers le fil au serveur à traiter.

Le serveur tente ensuite de désérialiser ce message dans un objet et tente d'appeler un message sur un objet d'implémentation du serveur. Cette méthode sur l'objet serveur aura très probablement les mêmes paramètres que le client - cependant, il y a une possibilité que l'appel échoue avant même que cette méthode ne soit appelée. Donc, ce que j'essaie de dire est: vous ne pouvez pas compter sur le fait que votre méthode côté serveur avec ses paramètres est vraiment appelée - il y a peut-être eu un problème avec, par exemple, authentification, le format du message, un en-tête manquant ou autre chose, qui provoque l'échec du côté serveur et déclenche une exception avant même que la méthode côté serveur ne soit appelée. En fin de compte, dans IErrorHandler, je ne connais aucun moyen d'obtenir le message et/ou la méthode et ses paramètres - tout ce que vous pouvez obtenir est l'erreur qui s'est produite sur le serveur, et vous peut l'utiliser pour le transformer en erreur SOAP. Ce que vous pourriez faire - côté client et côté serveur - est de créer un nouveau comportement qui se connecte à la pile WCF, et qui enregistre les méthodes appelées et les paramètres qui y sont passés - en implémentant une classe qui implémente l'interface IParameterInspector de WCF. Mais cela ne sera appelé que si le message sur le client et le serveur seront correctement désérialisés et que la méthode côté serveur sera appelée.

Découvrez quelques-unes de ces liens pour plus d'informations sur WCF extensibilité:

Hope this helps un peu!

Marc