Pergunta

Eu tenho 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 eu chamá-lo de externo aplicativo de console, é mostrar-me NullReferenceException na última linha:

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

Se remover o método Open() do webservice e insira construtor de tais linhas é a funcionar correctamente:

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

Como corrigir isso?P. S.MNConnection - a minha própria classe, que trabalha com OracleConnection.

Foi útil?

Solução

Cada chamada para um método de web irá invocar um novo serviço da web no lado do servidor, por isso não é bom para manter as variáveis privadas no Serviço da Web.

Para ambas as chamadas, lh.Abrir e lh.Obter, no lado do servidor, duas instâncias diferentes do WebService são criados, mesmo se você tiver apenas uma única instância do proxy no cliente.

Se você deseja corrigir isso, você só deve usar HttpContext.Atual.Sessão e armazenar seus útil instâncias de objetos neste gosta...

Você deve alterar o seu serviço da web como abaixo...

    [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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top