Question

J'ai ce code sur mon serveur ici (oui, je savais qu'ASMX était un mauvais idée mais WCF ne fonctionne pas du tout pour une raison quelconque):

<%@ 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;
}

quand je lance le code suivant:

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

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

Je compte bien revenir:

5
3

mais je suis rentré

5
5

Ma solution

  1. Utilisez wsdl.exe pour générer une classe de proxy
  2. Ajoutez les références nécessaires pour le compiler
  3. Utilisez la solution de Martin

Cela semble être lié

Edition: objet State ajouté.

Était-ce utile?

La solution

Les services Web étant sans état, ils ne stockent pas leur état entre plusieurs appels. Chaque fois que vous appelez une méthode, une nouvelle instance du service sera créée et ses membres auront à nouveau les valeurs par défaut.

Ce que vous pouvez faire, c'est activer l'état de session (comme vous l'avez fait) et stocker votre état dans la session ASP.NET.

Quelque chose comme ça:

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

C’est ce qui est requis côté serveur. Mais vous devez également prendre soin du côté client:

Puisqu'une session ASP.NET est identifiée par un cookie, vous devez vous assurer que vous transmettez le même cookie au serveur à chaque appel de méthode Web. Pour ce faire, vous devez instancier un CookieContainer et l’affecter à l’instance de proxy du service Web:

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

Autres conseils

Vous devez activer les sessions.

[WebMethod(EnableSession = true)]

Il me semble que son état de classe ne persiste pas entre les appels de méthode de session - un nouvel objet est probablement appelé à chaque fois. En fait, je ne suis pas sûr que vous puissiez compter sur la même instance d'objet chaque fois que vous appelez le service. La réponse de Joshua est correcte, mais vous aurez également besoin d'écrire du code pour conserver le champ interne de votre service dans cette session.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top