CookieContainer и веб-сервисы - PullRequest
       9

CookieContainer и веб-сервисы

0 голосов
/ 27 сентября 2010

У меня есть 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;
        }
}

Когда я вызываю его из внешнего консольного приложения, в последней строке показывается исключение NullReferenceException:

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

Если удалить метод Open () из веб-службыи вставьте в конструктор такие строки, это нормально работает:

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

Как это исправить?PS MNConnection - мой собственный класс, который работает с OracleConnection.

1 Ответ

1 голос
/ 27 сентября 2010

Каждый ваш вызов веб-метода будет вызывать новый веб-сервис на стороне сервера, поэтому не стоит хранить какие-либо частные переменные в веб-сервисе.

Для обоих вызовов, lh.Open и lh.Get, на стороне сервера создаются два разных экземпляра WebService, даже если у вас только один экземпляр прокси на клиенте.

Если вы хотите исправить это, вам следует использовать только HttpContext.Current.Session и хранить ваши полезные экземпляры объектов в таком виде, как ...

Вы должны изменить свой веб-сервис, как показано ниже ...

    [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; 
    } 
...