2014-06-17 6 views
1

Je suis toujours aux prises avec la partie serveur de mon application wcf. Le code suivant montre un exemple de service WCF. La méthode Getnews crée une instance de classe TOInews et modifie certaines de ses valeurs. Le code suivant fonctionne sans erreurs.Comment conserver l'état de l'objet entre plusieurs appels au sein d'un service WCF? Obtenir une "System.NullReferenceException"

namespace WCF_NewsService 
{ 
    public class News_Service : INews_Service 
    { 
     public TOInews Getnews() 
     { 
      TOInews objtoinews = new TOInews(); 

      objtoinews.ID = 1; 
      objtoinews.Header = "Mumbai News"; 
      objtoinews.Body = "2013 Code contest quiz orgnize by TOI"; 

      return objtoinews; 
     } 
    } 
} 

Le code suivant, au contraire, ne fonctionne pas. Et je me demande pourquoi. Maintenant, je veux stocker l'objet objtoinews dans mon service. Je ne veux pas créer un nouvel objet chaque fois que j'accède à Getnews(). Par conséquent, je crée une méthode nommée Initnews(), qui n'est appelée qu'une seule fois (au début) par le client (consommateur).

namespace WCF_NewsService 
{ 
    public class News_Service : INews_Service 
    { 
     TOInews objtoinews; 

     public TOInews Initnews() 
     { 
      objtoinews = new TOInews(); 
      return objtoinews; 
     } 

     public TOInews Getnews() 
     {   
      objtoinews.ID = 1; 
      objtoinews.Header = "Mumbai News"; 
      objtoinews.Body = "2013 Code contest quiz orgnize by TOI"; 

      return objtoinews; 
     } 
    } 
} 

Quand je lance ce code, je reçois un System.NullReferenceException, parce que, pour une raison quelconque, objtoinews égale null. Quelqu'un peut-il me dire pourquoi?

EDIT: Voici comment je l'appelle:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using WCF_NewsConsumer.Proxy_TOInews; 

namespace WCF_NewsConsumer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Proxy_TOInews.News_ServiceClient proxy = new News_ServiceClient("BasicHttpBinding_INews_Service"); 
      TOInews Tnews = new TOInews(); 

      Tnews = proxy.Initnews(); 
      Tnews = proxy.Getnews(); 

      Console.WriteLine(" News from:" + Tnews.ID + "\r\r \n " + Tnews.Header + "\r\r \n " + Tnews.Body + ""); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it –

+0

pouvez-vous montrer comment appelez-vous –

Répondre

1

Juste pour clarifier mon commentaire - vous aurez besoin d'utiliser SessionMode=Required sur votre contrat pour que le serveur de conserver l'état de l'objet construit sur plusieurs appels:

[ServiceContract(SessionMode=SessionMode.Required)] 
public interface INews_Service 
{ 
    // Initiating - indicates this must be called prior to non initiating calls 
    [OperationContract(IsInitiating=true, IsTerminating=false)] 
    TOInews Initnews(); 

    // You can choose whether this terminates the session (e.g. if more calls) 
    [OperationContract(IsInitiating=false, IsTerminating=true)] 
    TOInews Getnews(); 
} 

Vous devrez également régénérer le client pour mettre à jour les liaisons et le proxy. Cela dit, les sessions WCF doivent être utilisées avec parcimonie, car elles limitent l'évolutivité de votre solution (puisque le serveur consomme des threads et des ressources par session), et nécessitent également un routage de session fixe, car la session doit être redirigée vers le même serveur dans un scénario multi-serveur.

+0

Merci! Cela ressemble exactement à ce que je cherchais! Cependant, lorsque j'ajoute ces instructions, j'obtiens une 'System.InvalidOperationException'. J'utilise une application d'auto-hébergement, et j'obtiens l'exception quand j'appelle 'host.Open();'. – Boozzz

+0

Vous devrez régénérer le proxy client et vérifier les deux configurations depuis la modification du contrat. L'erreur peut indiquer que vous essayez d'utiliser une liaison [incompatibles comme basicHttpBinding] (http://stackoverflow.com/q/4406972/314291). Suggérez-vous de comparer les configs avec le [échantillon ici] (https://github.com/nonnb/WcfSessionSample) – StuartLC

+1

Vous êtes l'homme !! Merci beaucoup. Ça marche! – Boozzz

Questions connexes