2010-09-27 33 views
0

我的WebService:的CookieContainer和Web服務

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

如何解決它? P.S. MNConnection - 我自己的類,它適用於OracleConnection。

回答

1

您對Web方法的每次調用都會在服務器端調用一個新的Web服務,因此在Web Service上保留任何私有變量並不好。

對於這兩個調用,lh.Open和lh.Get,在服務器端,即使您在客戶端只有一個代理實例,也會創建兩個不同的WebService實例。

如果要解決這個問題,那麼你應該只使用HttpContext.Current.Session和存儲對象的你有用的實例以這種像...

你應該如下更改Web服務...

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