2010-08-24 4 views
1

Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas. J'ai créé un service WCF qui renvoie une liste de clients de la base de données Northwind.Comment appeler les services WCF dans Silverlight?

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

namespace WCFSilverlight.Web 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Customers" in code, svc and config file together. 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

    public class Customers : ICustomers 
    { 

     IEnumerable<Customer> ICustomers.GetAllCustomers() 
     { 
      NorthwindEntities objNorthwindEntities = new NorthwindEntities(); 
      var query = from cust in objNorthwindEntities.Customers 
         select cust; 
      return query.ToList(); 
     } 
    } 
} 

Et ceci est mon fragment de code App.xaml.cs: -

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    this.RootVisual = new MainPage(); 
    CustomersClient objCustomersClient = new CustomersClient(); 
    objCustomersClient.GetAllCustomersCompleted += new EventHandler<GetAllCustomersCompletedEventArgs>(client_GetNameCompleted); 
    objCustomersClient.GetAllCustomersAsync(); 
} 

void client_GetNameCompleted(object sender, GetAllCustomersCompletedEventArgs e) 
{ 
    MessageBox.Show(e.Result.ToString());  
} 

Si je ne me trompe pas les méthodes de Silverlight sont appelés de manière asynchrone. J'ai donc ajouté un gestionnaire d'événements pour le gérer, puis j'ai appelé la méthode pour récupérer les clients. Mais je ne reçois rien dans Messagebox. Plus loin quand j'essaye de garder un point d'arrêt sur client_GetNameCompleted, il n'exécute jamais. Mais si je le garde en Application_Startup, il l'exécute. Quel peut être le problème?

Expliquez-moi aussi si je le fais correctement? J'ai vu un exemple où une personne définit directement la fonction en utilisant des symboles étranges comme =>.

EDIT 1: - Veuillez également m'expliquer ce qu'est e.UserState dans e. Que contient-elle et que puis-je faire avec?

EDIT 2: -: - Je reçois cette erreur http://img178.imageshack.us/img178/9070/53923202.jpg

Le service WCF fonctionne parfaitement, je l'ai testé la requête de lien. Il n'y a donc pas de problème avec la connexion Sql Server ou WCF. Quelque chose ne va pas avec mon client seulement.

Ceci est mon ServiceReference.ClientConfig: -

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_ICustomers" maxBufferSize="2147483647" 
        maxReceivedMessageSize="2147483647"> 
        <security mode="None" /> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://localhost:50622/Customers.svc" binding="basicHttpBinding" 
       bindingConfiguration="BasicHttpBinding_ICustomers" contract="CustomerServ.ICustomers" 
       name="BasicHttpBinding_ICustomers" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

Pouvez-vous me dire maintenant ce qui est faux?

Merci à l'avance :)

Mise à jour: - Je lis dans google vous devez définir le mode de sérialisation à sens unique. Mais où est-ce que je mets ceci? Qu'est-ce que j'écris où?

+0

Le e.Result doit être le type de IEnumerable que vous pourriez avoir à jeter en arrière. – Jirapong

+0

Enfin j'ai fait le chargement paresseux dans le concepteur et cela a fonctionné :) – TCM

Répondre

2
  1. Vous avez raison, Tous les appels réseau dans Silverlight sont effectués de manière asynchrone.
  2. La syntaxe => que vous mentionnez est un raccourci pour définir une méthode déléguée, appelée lambda. (voir ci-dessous)
  3. Vous devriez être en mesure de définir un point d'arrêt dans le gestionnaire d'événements Completed, sinon essayez de redémarrer Visual Studio (je l'ai vu agir étrangement avant).
  4. e.UserState aura une référence à tout objet que vous mettez dans la variable UserState pour l'appel asynchrone (notez la surcharge supplémentaire).

code:

objCustomersClient.GetAllCustomersCompleted = delegate(object Sender, GetAllCustomersCompletedEventArgs e) 
{ 
    MessageBox.Show(e.Result.ToString());   
}; 

// is the same as 

objCustomersClient.GetAllCustomersCompleted += new EventHandler<GetAllCustomersCompletedEventArgs>(client_GetNameCompleted); 
void client_GetNameCompleted(object sender, GetAllCustomersCompletedEventArgs e) 
{ 
    MessageBox.Show(e.Result.ToString());  
} 

// which is same as 

objCustomersClient.GetAllCustomersCompleted += (sender, e) => { MessageBox.Show(e.Result.ToString()); }; 
+0

S'il vous plaît lire mon post édité. – TCM

+0

Si vous utilisez Linq-To-SQL, vous devez définir le mode de sérialisation sur les entités via le concepteur Linq-To-SQL. Sélectionnez la table et affichez ses propriétés. La sérialisation sera l'une d'entre elles. – Nate

Questions connexes