cookieContainer و WebServices
-
25-09-2019 - |
سؤال
لدي خدمة ويب:
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;
}