我有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());
如果从webservice中删除Open()方法并插入构造函数这样的行,它可以正常工作:
_conn.Open(login, password);
_lpu = (MNLpu)_conn.CreateLPU();
如何解决? 附: MNConnection - 我自己的类,与OracleConnection一起使用。
答案 0 :(得分:1)
您对Web方法的每次调用都将在服务器端调用新的Web服务,因此在Web服务上保留任何私有变量都不好。
对于两个调用,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;
}