2011-03-07 5 views
0

En continuant à apprendre WCF, j'essaye d'écrire un petit programme qui, avec un clic d'un bouton, prendrait le travail de texbox1, le passerait à ServiceContract et récupérerait sa longueur.se connecter à ServiceContract?

Voici jusqu'où j'ai pu aller.

Form1.cs:

... 
wcfLib.Service myService = new wcfLib.Service(); 

private void button1_Click(object sender, EventArgs e) 
{ 
    textBox2.Text = Convert.ToString(myService.go(textBox1.Text)); 
} 

... 

et le fichier WCF:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace wcfLib 
{ 

    [ServiceContract] 
    public interface IfaceService 
    { 
     [OperationContract] 
     int wordLen(string word); 
    } 



    public class StockService : IfaceService 
    { 
     public int wordLen(string word) 
     { 
      return word.Length; 
     } 
    } 





    public class Service 
    { 
     public int go(string wordin) 
     { 

      ServiceHost serviceHost = new ServiceHost(typeof(StockService), new Uri("http://localhost:8000/wcfLib")); 
      serviceHost.AddServiceEndpoint(typeof(IfaceService), new BasicHttpBinding(), ""); 

      serviceHost.Open(); 

      int ret = **///// HOW SHOULD I PASS wordin TO StockService to get word.Length in return?** 

      serviceHost.Close(); 

      return ret; 
     } 
    } 


} 

ce que je ne peux pas comprendre en ce moment, est comment puis-je passer la variable wordin ci-dessus dans le ServiceContract?

+0

Comprenez-vous ce que WCF est supposé faire? Dans la méthode Go, vous avez hébergé le service, mais dans la même méthode, vous voulez être un client de ce service. Pourquoi?Si vous voulez apprendre WCF créer deux traitées et la communication entre eux. Cela n'a pas de sens que vous pouvez simplement créer une instance de StockService directement et appeler wordLen sans l'héberger dans WCF. –

+0

>>> Comprenez-vous ce que la WCF est censée faire? Vraiment, pas beaucoup. :(Je comprends ce qu'est un ServiceContract et comment il peut accéder à une sorte de fonction à partir de l'interface, mais je n'arrive pas à comprendre comment le diviser en différentes applications qui se transmettent des données ... – Rob

+0

Essayez de passer par ce tutoriel: http://msdn.microsoft.com/en-us/library/ms734712.aspx –

Répondre

1

Vous devez créer le client dans votre formulaire et appelez wordLen() directement ... seule une classe qui hérite de IfaceService peut être appelé en tant que service WCF. Alors:

// You'll have to create references to your WCF service in the project itself... 
// Right-click your form project and pick 'Add Service Reference', picking 
// 'Discover', which should pick up the service from the service project... else 
// enter http://localhost:8000/wcfLib and hit 'Go'. 
// You'll have to enter a namespace, e.g. 'MyWcfService'... that namespace is 
// used to refer to the generated client, as follows: 
MyWcfService.wcfLibClient client = new MyWcfService.wcfLibClient(); 

private void button1_Click(object sender, EventArgs e) { 
    // You really shouldn't have the client as a member-level variable... 
    textBox2.Text = Convert.ToString(client.wordLen(textBox1.Text)); 
} 

Si votre classe Service est destiné à accueillir le service WCF, il doit être son propre exécutable en cours d'exécution et ... mettre le code que vous avez dans go() dans Main()

ou héberger votre WCF Service dans IIS ... beaucoup plus facile!


Modifier

IIS = Internet Information Services ... hébergement essentiellement le service WCF sur le Web.

Pour héberger dans IIS, créez un nouveau projet "Application de service WCF". Vous obtiendrez un web.config et une interface par défaut et un fichier .svc. Renommez-les ou ajoutez de nouveaux éléments, Service WCF, au projet. Vous devrez lire un peu sur le déploiement sur IIS si vous suivez cette route, mais pour le débogage dans Visual Studio, cela fonctionne bien.

Pour séparer en deux applications, il suffit de faire du formulaire son propre projet ... la référence du service est définie via le fichier de configuration de l'application; vous pointez simplement sur l'adresse de la machine ou du site Web, par ex. http://myintranet.mycompany.com:8000/wcflib ou http://myserver:8000/wcflib.

Merci pour le vote!

+0

Super, merci! :) ça marche! :) En passant, qu'est-ce que IIS? :) – Rob

+0

et une question de plus, que dois-je faire pour le diviser en deux applications qui fonctionnent sur des machines différentes? – Rob

0

Vous avez définitivement des choses en tête. Vous ne voulez pas créer le ServiceHost dans votre méthode Go, ou au moins, vous ne le créerez jamais dans aucune méthode invoquée par le client, car comment le client pourrait-il l'appeler si le service n'a pas encore été créé?

Un service dans WCF est démarré, puis vous pouvez appeler ses méthodes à partir d'un client distant. EG, ceci est votre principal() pour le service:

ServiceHost serviceHost = new ServiceHost(typeof(StockService), new Uri("http://localhost:8000/wcfLib")); 
serviceHost.AddServiceEndpoint(typeof(IfaceService), new BasicHttpBinding(), ""); 
serviceHost.Open(); 
Console.WriteLine("Press return to terminate the service"); 
Console.ReadLine(); 
serviceHost.Close(); 

Alors pour votre client vous utiliseriez « Ajouter un service de référence » dans Visual Studio (clic droit sur le projet dans l'Explorateur de solutions pour trouver cette option de menu) et entrez l'adresse du service. Visual Studio va créer un proxy pour votre service, et c'est ce que vous instancieriez et utiliseriez sur le client. EG:

MyServiceClient client = new MyServiceClient(); 

textBox2.Text = Convert.ToString(client.wordLen(textBox1.Text)); 
+0

Super, merci! :) ça marche! :) – Rob

+0

et une question de plus, que dois-je faire pour le diviser en deux applications qui fonctionnent sur des machines différentes? – Rob

+0

Le contrat de service et son implémentation doivent être dans un projet/assemblage différent. Ensuite, vous installez chacun sur des machines séparées. Le projet client n'aurait pas le ServiceContract ou l'implémentation dans ses références - il s'appuierait entièrement sur le code généré pour le proxy par Visual Studio. –