¿Cómo puedo acceder a la sesión en un método web?

85

¿Puedo usar valores de sesión dentro de un WebMethod?

Intenté usar System.Web.Services.WebMethod(EnableSession = true)pero no puedo acceder al parámetro de sesión como en este ejemplo :

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

aquí está el JS que llama al método web:

    $.ajax({
        type: "POST",
        url: 'Catalogo.aspx/checaItem',
        data: "{ id : 'teste' }",
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            alert(data);
        }
    });
Sérgio
fuente
4
Publicar un ejemplo de código nos ayudará a darle una respuesta.
volpav
¿Está recibiendo una excepción?
Darin Dimitrov
1
En el ejemplo anterior, no veo que intente acceder a ningún valor de sesión. Primero debe configurar la var de sesión y luego acceder a ella como el enlace que publicó. return (int) Sesión ["Conversiones"];
capdragon
@volpav proporcionó un código de ejemplo.
BrainSlugs83
No, @capdragon, la propiedad Session de la página no existe para los métodos estáticos (los WebMethods deben ser estáticos); está preguntando dónde encontrar la propiedad, como se publica a continuación, se encuentra en el HttpContext actual.
BrainSlugs83

Respuestas:

116

Puedes usar:

HttpContext.Current.Session

Pero lo será a nullmenos que también especifique EnableSession=true:

[System.Web.Services.WebMethod(EnableSession = true)]
public static String checaItem(String id)
{ 
    return "zeta";
}
WraithNath
fuente
18
Irónicamente, esto es lo que ya estaba haciendo, solo que no estaba funcionando para mí. HttpContext.Current.Session.Count devolvía 0 (es decir, no hay elementos en la sesión). Para mí, la respuesta estaba en la pregunta, cambiar [WebMethod] a [WebMethod (EnableSession = true)] funcionó. ¡Woot!
BrainSlugs83
4
Recuerde configurar web.config <sessionState mode = "InProc" />
Moesio
10

Hay dos formas de habilitar la sesión para un método web:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

El primero con el argumento del constructor enableSession:trueno me funciona. El segundo con EnableSessionobra inmobiliaria.

Brujo
fuente
No puedo averiguar si el primero se compila, creo que no. El segundo funciona porque está configurando la propiedad (siendo obvio aquí XD).
MVCDS
@MVCDS ¿Por qué crees que no debería compilarse? Puede encontrar un constructor público WebMethodAttribute(Boolean)en docs.
Warlock
Estás absolutamente en lo correcto. ¿Se comporta de manera diferente si no establece el nombre del parámetro? Porque si lo hace, sucedió algo muy extraño cuando estaban codificando constructores (para atributos).
MVCDS
1

Para habilitar la sesión tenemos 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.";
    }


}

Ahora, para recuperar estos nombres usando la sesión, podemos ir así

[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 lo que recuperará todos los nombres de la sesión y mostrará.

Debendra Dash
fuente
0

Puede probar así [WebMethod] public static void MyMethod (cadena ProductID, cadena Precio, cadena Cantidad, cadena Total) // Agregar nuevo parámetro aquí {db_class Connstring = new db_class (); tratar {

            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
fuente
0

En C #, en el código detrás de la página usando el método web,

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

Y, en la 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
fuente