CookieContainer和WebServices

时间:2010-09-27 10:13:19

标签: c# web-services cookiecontainer

我有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一起使用。

1 个答案:

答案 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; 
    }