Como posso acessar a sessão em um método web?


85

Posso usar valores de sessão dentro de um WebMethod?

Já tentei usar, System.Web.Services.WebMethod(EnableSession = true)mas não consigo acessar o parâmetro Session como neste exemplo :

    [System.Web.Services.WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod()]
    public static String checaItem(String id)
    { 
        return "zeta";
    }

aqui está o JS que chama o método da web:

    $.ajax({
        type: "POST",
        url: 'Catalogo.aspx/checaItem',
        data: "{ id : 'teste' }",
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            alert(data);
        }
    });

4
Publicar um exemplo de código nos ajudará a fornecer uma resposta.
volpav

Você está recebendo uma exceção?
Darin Dimitrov

1
No exemplo acima, não vejo você tentando acessar nenhum valor de sessão. Você precisa definir a var da sessão primeiro e depois acessá-la como o link que você postou. return (int) Session ["Conversões"];
capdragon

@volpav ele forneceu um código de exemplo.
BrainSlugs83,

Não, @capdragon a propriedade Session da página não existe para métodos estáticos (WebMethods devem ser estáticos) - ele está perguntando onde encontrar a propriedade - conforme postado abaixo, ela reside no HttpContext atual.
BrainSlugs83,

Respostas:


116

Você pode usar:

HttpContext.Current.Session

Mas será, a nullmenos que você também especifique EnableSession=true:

[System.Web.Services.WebMethod(EnableSession = true)]
public static String checaItem(String id)
{ 
    return "zeta";
}

18
Ironicamente, isso é o que eu já estava fazendo - só que não estava funcionando para mim. HttpContext.Current.Session.Count estava retornando 0 (ou seja, nenhum item na Sessão). Para mim, a resposta estava na pergunta, alterar [WebMethod] para [WebMethod (EnableSession = true)] funcionou. Uau!
BrainSlugs83,

4
Lembre-se de configurar web.config <sessionState mode = "InProc" />
Moesio

10

Existem duas maneiras de ativar a sessão para um Método da Web:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

O primeiro com argumento do construtor enableSession:truenão funciona para mim. O segundo com EnableSessionobras imobiliárias.


Não consigo descobrir se o primeiro compila - acredito que não. O segundo funciona porque você está definindo a propriedade (apenas sendo óbvio aqui XD).
MVCDS

@MVCDS Por que você acha que não deveria ser compilado? Você pode encontrar um construtor público WebMethodAttribute(Boolean)em documentos.
Warlock

Você está absolutamente correto. Ele se comporta de maneira diferente se você não definir o nome do parâmetro? Porque se isso acontecer, algo muito estranho aconteceu quando eles estavam codificando os construtores (para atributos).
MVCDS

1

Para ativar a sessão, temos que usar [WebMethod (enableSession: true)]

[WebMethod(EnableSession=true)]
public string saveName(string name)
{
    List<string> li;
    if (Session["Name"] == null)
    {
        Session["Name"] = name;
        return "Data saved successfully.";

    }

    else
    {
        Session["Name"] = Session["Name"] + "," + name;
        return "Data saved successfully.";
    }


}

Agora, para recuperar esses nomes usando a sessão, podemos continuar assim

[WebMethod(EnableSession = true)]
    public List<string> Display()
    {
        List<string> li1 = new List<string>();
        if (Session["Name"] == null)
        {

            li1.Add("No record to display");
            return li1;
        }

        else
        {
            string[] names = Session["Name"].ToString().Split(',');
            foreach(string s in names)
            {
                li1.Add(s);
            }

            return li1;
        }

    }

por isso recuperará todos os nomes da sessão e mostrará.


0

Você pode tentar assim [WebMethod] public static void MyMethod (string ProductID, string Price, string Quantidade, string Total) // Adicionar novo parâmetro aqui {db_class Connstring = new db_class (); tentar {

            DataTable dt = (DataTable)HttpContext.Current.Session["aaa"];

            if (dt == null)
            {
                DataTable dtable = new DataTable();

                dtable.Clear();
                dtable.Columns.Add("ProductID");// Add new parameter Here
                dtable.Columns.Add("Price");
                dtable.Columns.Add("Quantity");
                dtable.Columns.Add("Total");
                object[] trow = { ProductID, Price, Quantity, Total };// Add new parameter Here
                dtable.Rows.Add(trow);
                HttpContext.Current.Session["aaa"] = dtable;                   
            }
            else
            {
                object[] trow = { ProductID, Price, Quantity, Total };// Add new parameter Here
                dt.Rows.Add(trow);
                HttpContext.Current.Session["aaa"] = dt;
            }


        }
        catch (Exception)
        {
            throw;
        }
    }


0

Em C #, no código por trás da página usando o método da web,

[WebMethod(EnableSession = true)]
        public static int checkActiveSession()
        {
            if (HttpContext.Current.Session["USERID"] == null)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }

E, na página aspx,

$.ajax({
                type: "post",
                url: "",  // url here
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: '{ }',
                crossDomain: true,
                async: false,
                success: function (data) {
                    returnValue = data.d;
                    if (returnValue == 1) {

                    }
                    else {
                        alert("Your session has expired");
                        window.location = "../Default.aspx";
                    }
                },
                error: function (request, status, error) {
                    returnValue = 0;
                }
            });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.