0

我有网络服务:

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());

如果从 web 服务中删除 Open() 方法并插入到构造函数这样的行,它工作正常:

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

如何解决?PS MNConnection - 我自己的类,它与 OracleConnection 一起使用。

4

1 回答 1

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; 
    } 
于 2010-09-27T10:22:40.957 回答