Pergunta

Eu tenho esse código no meu servidor aqui (Sim, eu conhecida ASMX é um mau idéia, mas WCF não funciona em todos por algum motivo):

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

quando eu executar o código folloing:

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

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

Espero voltar:

5
3

mas voltei

5
5

My Solution

  1. usée wsdl.exe para gerar uma classe de proxy
  2. Adicionar referências, conforme necessário para obtê-lo para compilar
  3. solução Use de Martin

Isto parece estar relacionado

Edit:. Estado Adicionado objeto

Foi útil?

Solução

Os serviços Web são apátridas, para que eles não armazenar seu estado entre várias chamadas. Toda vez que você chamar um método, uma nova instância do serviço será criado e seus membros terão os valores padrão novamente.

O que você pode fazer, é permitir que o estado da sessão (como você tem feito) e armazenar o seu estado na sessão ASP.NET.

Algo parecido com isto:

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

Este foi o que é necessário no lado do servidor. Mas você também tem que tomar cuidado no lado do cliente:

Uma vez que uma sessão ASP.NET é identificado por um cookie, você tem que ter certeza que você está passando o mesmo cookie para o servidor com cada chamada de método web. Para fazer isso, você tem que instanciar um CookieContainer e atribuí-lo à instância proxy de serviço da web:

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

Outras dicas

Você precisa ativar sessões.

[WebMethod(EnableSession = true)]

Parece-me como seu estado classe não persiste entre chamadas de método de sessão - provavelmente um novo objeto está sendo chamado cada vez. Estou realmente não tenho certeza que você pode confiar em obter a mesma instância do objeto cada vez que você chamar o serviço. A resposta de Joshua está correto, mas você também precisa escrever código para persistir campo interna do seu serviço para essa sessão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top