سؤال

لدي خدمة ويب:

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; 
    } 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top