سؤال

لدي هذا الكود على السيرفر هنا (نعم أنا معروف ASMX فكرة سيئة ولكن صندوق رأس المال العامل لا يعمل في جميع لسبب ما):

<%@ WebService Language="C#" Class="Test" %>

using System.Web;
using System.Web.Services;

[WebService(Namespace = "http://smplsite.com/smplAccess")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Test : System.Web.Services.WebService
{
    State s;

    public Test()
    {
        s = (Session["foo"] ?? (Session["foo"] = new State())) as State ;
    }

    [WebMethod(EnableSession = true)]
    public void Set(int j) { i=j; }

    [WebMethod(EnableSession = true)]
    public int Get() { return i; }
}

class State
{
    public int i = 5;
}

عند تشغيل بعد رمز:

class Program
{
    static void Main(string[] args)
    {
        var ser = new ServiceReference1.TestSoapClient();

        Console.WriteLine(ser.Get());
        ser.Set(3);
        Console.WriteLine(ser.Get());
    }
}

أتوقع أن تعود:

5
3

ولكن عدت

5
5

الحل

  1. Usee wsdl.exe لإنشاء فئة وكيل
  2. إضافة مراجع حسب الحاجة للحصول عليه تجميع
  3. استخدام مارتن الحل

هذا يبدو ذات الصلة

تحرير:وأضاف أن الدولة كائن.

هل كانت مفيدة؟

المحلول

خدمات الويب عديمي الجنسية ، حتى لا تخزين الدولة بين مكالمات متعددة.في كل مرة كنت استدعاء أسلوب مثيل جديد من الخدمة سيتم إنشاء و أعضاء القيم الافتراضية مرة أخرى.

ما يمكنك القيام به ، هو تمكين حالة جلسة العمل (كما فعلت) و تخزين الدولة في ASP.NET الدورة.

شيء من هذا القبيل:

[WebMethod(EnableSession = true)]
public void Set(int j) { Session["i"] = j; }

[WebMethod(EnableSession = true)]
public int Get() { return Session["i"] == null ? 5 : (int)Session["i"]; }

هذا ما هو مطلوب من جانب الخادم.ولكن عليك أيضا أن تأخذ الرعاية من جانب العميل:

منذ ASP.NET الدورة التي حددها كوكي, لديك للتأكد من أن يتم تمرير نفس الكعكة إلى الملقم مع كل ويب استدعاء الأسلوب.للقيام بذلك عليك أن مثيل CookieContainer وإسناد ذلك إلى خدمة ويب وكيل سبيل المثال:

static void Main(string[] args)
{
    var ser = new ServiceReference1.TestSoapClient();
    ser.CookieContainer = new System.Net.CookieContainer();
    // ...
}

نصائح أخرى

تحتاج إلى تشغيل على دورات.

[WebMethod(EnableSession = true)]

يبدو لي ليس استمرار الدرجة الدولة بين الدورة طريقة المكالمات - ربما كائن جديد يسمى كل مرة.في الحقيقة لست متأكدا من أنك يمكن أن تعتمد على الحصول على نفس الكائن سبيل المثال في كل مرة كنت استدعاء الخدمة.جوشوا هو الجواب الصحيح, ولكن عليك أيضا تحتاج إلى كتابة رمز تستمر الخدمة الداخلية الميدانية في تلك الدورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top