Pregunta

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

Cuando llamo a que es de aplicación de consola externa, de Show Me NullReferenceException en la última línea:

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

Si remove Open () método de servicio web y la inserción de tales líneas constructor Es funciona bien:

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

¿Cómo solucionarlo? PD MNConnection -. Mi propia clase, que trabaja con OracleConnection

¿Fue útil?

Solución

Su cada llamada a un método web invocar un nuevo servicio web en el lado del servidor, por lo que no es bueno para mantener las variables privadas en el servicio web.

Para ambas llamadas, lh.Open y lh.Get, en el lado del servidor, dos instancias diferentes de servicio Web se crean, incluso si tiene sólo una única instancia de su proxy al cliente.

Si desea corregir esto, entonces usted debe utilizar solamente HttpContext.Current.Session y almacenar sus instancias de objetos útiles en esta como ...

Se debe cambiar su servicio web de la siguiente manera ...

    [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; 
    } 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top