2009-10-07 10 views
3

J'ai une application de bureau C#, et je consomme un service web sans problèmes (wsdl ajouté par "ajouter des références de service", donc je crée un objet et appelle ses fonctions).Comment faire un long client d'interrogation en C#?

Maintenant, je veux utiliser de longues techniques d'interrogation, mais je ne peux pas comprendre comment faire cela du point de vue du client.

Comment configurer le délai d'expiration? Dois-je utiliser un fil dédié à cela? Existe-t-il un exemple d'application de bureau C#? (Ont pas trouvé)

Merci, BARRAGE

Répondre

4

Vous devriez pouvoir configurer le délai d'attente sur l'objet de service Web - les détails dépendra exactement quelle classe qu'il utilise, mais regardez WebClientProtocol.Timeout pour un Exemple.

Maintenant, vous pouvez soit appeler synchrone à partir d'un fil dédié, ou vous pouvez faire un appel au service Web asynchrone pour commencer, en spécifiant un rappel à exécuter (probablement sur un fil de pool de threads) lorsque le service réponses. Dans ce cas, vous pouvez trouver que vous pouvez spécifier le délai d'attente sur l'appel asynchrone lui-même - encore une fois, cela dépendra exactement du type de classe de proxy de service Web que vous avez. De cette façon, vous n'avez pas besoin de "gâcher" un thread qui attend la réponse - mais vous pouvez trouver que le modèle de programmation asynchrone est plus difficile à comprendre que le modèle synchrone. Si vous avez seulement une ou deux de ces demandes à la fois, le couple supplémentaire de threads est peu susceptible de poser problème. Si vous attendez des réponses de 500 services différents, c'est une question différente et le modèle asynchrone serait définitivement la solution.

+0

Merci pour votre réponse. J'ai essayé avec WebClientProtocol.Timeout, mais je ne sais pas quoi en faire. Mon code est fondamentalement: ServiceReference1.TestSOAPImplClient test = new ServiceReference1.TestSOAPImplClient(); label1.Text = test.helloworld(); Et il n'y a pas de propriété timeout. J'ai essayé de l'ajouter dans le fichier reference.cs généré sans résultat. Je pense qu'il y a une étape de base manquante quelque part :) (btw, le service web à distance a été fait en Java) Pour le problème de thread, je n'aurai que 2 ou 3 longues demandes d'interrogation max, donc je vais aller synchrone avec des discussions pour le moment. –

+0

De quelle classe dérive TestSOAPImplClient? –

+0

Dans reference.cs, j'ai: [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute ("System.ServiceModel", "3.0.0.0")] public partielle classe TestSOAPImplClient: System.ServiceModel .ClientBase , WS_Client_Test1.ServiceReference1.TestSOAPImpl . TestSOAPImpl est une interface et ne dérive de rien.Tout cela a été généré automatiquement, peut-être que ce n'est pas la meilleure façon d'utiliser les services web ... :) –

1

Pour les problèmes de threading, voir la réponse de Jon. Pour le problème de timeout, voici la solution: In vs 2008, quand j'ajoute une "référence de service" d'un wsdl, il utilisera WCF par défaut, et je ne trouve pas comment définir une valeur de timeout avec il. Donc, lorsque je clique avec le bouton droit sur Service References, je dois choisir "web references" (advanced/add web reference). De cette façon, il utilisera uniquement les services Web "normaux" et le paramètre Timeout est disponible.