Cookekontainer и WebServices
-
25-09-2019 - |
Вопрос
У меня есть 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 () метод от WebService и вставьте в конструктор такие строки, это работает нормально:
_conn.Open(login, password);
_lpu = (MNLpu)_conn.CreateLPU();
Как это исправить? PS Mnconnection - мой собственный класс, который работает с OracleConnection.
Решение
Ваш каждый звонок в веб-метод будет вызывать новый веб-сервис на стороне сервера, поэтому не стоит держать какие-либо частные переменные на веб-сервисе.
Для вызовов 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;
}