Question

Je WebService:

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 ces lignes c'est fonctionne très bien:

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

Comment résoudre ce problème? Post-scriptum MNConnection -. Ma propre classe, qui fonctionne avec OracleConnection

Était-ce utile?

La solution

Votre chaque appel à une méthode Web invoquera un nouveau service Web côté serveur, il est donc pas bon de garder toutes les variables privées sur le service Web.

Pour les appels, lh.Open et lh.Get, côté serveur, deux instances différentes de WebService sont créés même si vous avez une seule instance unique de votre proxy au 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; 
    } 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top