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);
        }
    });
Sérgio
fonte
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";
}
WraithNath
fonte
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.

Bruxo
fonte
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á.

Debendra Dash
fonte
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;
        }
    }
Md. Didarul Islam
fonte
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;
                }
            });
Raman
fonte