Pregunta

Tengo este código en mi servidor aquí (Sí, sé que ASMX es un mal idea pero WCF no funciona en absoluto por alguna razón):

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

cuando ejecuto el siguiente código:

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

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

Espero volver:

5
3

pero volví

5
5

Mi solución

  1. Usee wsdl.exe para generar una clase proxy
  2. Agregue referencias según sea necesario para compilarlo
  3. Utilice solución de Martin

Esto parece relacionado

Editar: Objeto de estado agregado.

¿Fue útil?

Solución

Los servicios web no tienen estado, por lo que no almacenan su estado entre varias llamadas. Cada vez que llame a un método, se creará una nueva instancia del servicio y sus miembros volverán a tener los valores predeterminados.

Lo que puedes hacer es habilitar el estado de la sesión (como lo has hecho) y almacenar tu estado en la sesión ASP.NET.

Algo como esto:

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

Esto era lo que se requiere en el lado del servidor. Pero también hay que tener cuidado en el lado del cliente:

Dado que una sesión de ASP.NET se identifica mediante una cookie, debe asegurarse de pasar la misma cookie al servidor con cada llamada de método web. Para hacerlo, debe crear una instancia de CookieContainer y asignarlo a la instancia de proxy del servicio web:

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

Otros consejos

Debes activar las sesiones.

[WebMethod(EnableSession = true)]

Me parece que no se trata de un estado de clase no persistente entre las llamadas de método de sesión, probablemente cada vez se llame a un nuevo objeto. Realmente no estoy seguro de que pueda confiar en obtener la misma instancia de objeto cada vez que llame al servicio. La respuesta de Joshua es correcta, pero también deberá escribir código para mantener el campo interno de su servicio en esa sesión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top