Domanda

Ho 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;
        }
}

Quando chiamo è da un'applicazione console esterna, di spettacolo mi NullReferenceException on nell'ultima riga:

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

Se remove Open () metodo dal webservice ed inserto al costruttore tali linee E 'funziona bene:

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

Come risolvere il problema? Post scriptum MNConnection -. La mia classe, che lavora con OracleConnection

È stato utile?

Soluzione

Il tuo ogni chiamata a un metodo web sarà invocare un nuovo servizio web sul lato server, quindi non è bene tenere eventuali variabili private su Web Service.

Per entrambe le chiamate, lh.Open e lh.Get, sul lato server, vengono creati due differenti istanze di WebService, anche se si dispone di una sola singola istanza del proxy sul client.

Se si desidera correggere questo, allora si dovrebbe utilizzare solo HttpContext.Current.Session e memorizzare le istanze utili di oggetti in questo tipo ...

Si dovrebbe cambiare il vostro servizio web, come di seguito ...

    [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; 
    } 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top