Frage

Ich habe 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;
        }
}

Wenn ich nenne es von einem externen Konsolenanwendung, es Show me Nullreferenceexception auf letzte Zeile:

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

Wenn entfernen Open () -Methode von Webservice und Einsatz Konstruktor solcher Linien ist es funktioniert:

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

Wie es zu beheben? P. S. MNConnection -. Meine eigene Klasse, die mit OracleConnection arbeitet

War es hilfreich?

Lösung

Ihre jeder Aufruf einer Web-Methode wird eine neue Web-Service auf Server-Seite aufzurufen, so dass es nicht gut ist, alle privaten Variablen auf Web-Service zu halten.

Für beiden Anrufe, lh.Open und lh.Get, auf Server-Seite, zwei verschiedene Instanzen von WebService werden erstellt, auch wenn Sie nur eine einzige Instanz des Proxy beim Kunden hat.

Wenn Sie diese korrigieren möchten, dann sollten Sie nur HttpContext.Current.Session verwenden und speichern Sie Ihre nützliche Instanzen von Objekten in so ...

Sie sollten Ihren Web-Service ändern, wie unten ...

    [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; 
    } 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top