2010-09-27 7 views
0

Je WebService:CookieContainer et WebServices

public class Service1:WebService {   
     private readonly MNConnection _conn; 
     private MNLpu _lpu; 

     public Service1() { 
      _conn = new MNConnection(); 
     } 

     [WebMethod(EnableSession = true)] 
     public void Open(string login, string password) { 
      _conn.Open(login, password); 
      _lpu = (MNLpu)_conn.CreateLPU(); 
     } 

     [WebMethod(EnableSession = true)] 
     public decimal Get() { 
      return _lpu.Count; 
     } 
} 

Quand je l'appelle est de l'application de la console externe, il est me montrer NullReferenceException sur la dernière ligne:

CookieContainer cookie = new CookieContainer(); 
    Service1 lh = new Service1 {CookieContainer = cookie}; 
    lh.Open("login", "pwd"); 
    Console.WriteLine(lh.Get()); 

Si supprimer méthode Open() de webservice et insérer au constructeur de telles lignes cela fonctionne très bien:

 _conn.Open(login, password); 
     _lpu = (MNLpu)_conn.CreateLPU(); 

Comment le réparer? P.S. MNConnection - ma propre classe, qui fonctionne avec OracleConnection.

Répondre

1

Chaque appel à une méthode Web appelle un nouveau service Web côté serveur. Il est donc inutile de conserver des variables privées sur le service Web.

Pour les deux appels, lh.Open et lh.Get, côté serveur, deux instances différentes de WebService sont créées même si vous n'avez qu'une seule instance de votre proxy sur le client.

Si vous voulez corriger cela, alors vous ne devez utiliser HttpContext.Current.Session et stocker vos instances d'objets utiles dans ce ... comme

Vous devez changer votre service Web comme ci-dessous ...

[WebMethod(EnableSession = true)] 
    public void Open(string login, string password) { 
     MNConnection _conn = new MNConnection(); 
     _conn.Open(login, password); 
     HttpContext.Current.Session["MyConn"] = _conn; 
     HttpContext.Current.Session["LPU"] = _conn.CreateLPU(); 
    } 

    [WebMethod(EnableSession = true)] 
    public decimal Get() { 
     MNLPU _lpu = HttpContext.Current.Session["LPU"] as MNLPU; 
     return _lpu.Count; 
    }