Jak mogę uzyskać dostęp do sesji w metodzie internetowej?

85

Czy mogę używać wartości sesji wewnątrz WebMethod?

Próbowałem użyć, System.Web.Services.WebMethod(EnableSession = true)ale nie mogę uzyskać dostępu do parametru sesji, jak w tym przykładzie :

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

oto JS, który wywołuje metodę web:

    $.ajax({
        type: "POST",
        url: 'Catalogo.aspx/checaItem',
        data: "{ id : 'teste' }",
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            alert(data);
        }
    });
Sérgio
źródło
4
Wpisanie przykładowego kodu pomoże nam udzielić odpowiedzi.
volpav
Czy otrzymujesz wyjątek?
Darin Dimitrov
1
W powyższym przykładzie nie widzę, abyś próbował uzyskać dostęp do jakichkolwiek wartości sesji. Musisz najpierw ustawić zmienną sesji, a następnie uzyskać do niej dostęp, tak jak opublikowany link. return (int) Session ["Conversions"];
capdragon
@volpav podał przykładowy kod.
BrainSlugs83
Nie, @capdragon właściwość Session strony nie istnieje dla metod statycznych (WebMethods muszą być statyczne) - pyta, gdzie znaleźć właściwość - jak napisano poniżej, znajduje się ona w bieżącym HttpContext.
BrainSlugs83

Odpowiedzi:

116

Możesz użyć:

HttpContext.Current.Session

Ale tak będzie, nullchyba że określisz również EnableSession=true:

[System.Web.Services.WebMethod(EnableSession = true)]
public static String checaItem(String id)
{ 
    return "zeta";
}
WraithNath
źródło
18
Jak na ironię, to właśnie robiłem - tylko że to nie działało dla mnie. HttpContext.Current.Session.Count zwracał 0 (tj. Brak elementów w sesji). Dla mnie odpowiedź była w pytaniu, zmiana [WebMethod] na [WebMethod (EnableSession = true)] zadziałała. Woot!
BrainSlugs83
4
Pamiętaj, aby skonfigurować web.config <sessionState mode = "InProc" />
Moesio
10

Istnieją dwa sposoby włączenia sesji dla metody internetowej:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

Pierwszy z argumentem konstruktora enableSession:truenie działa dla mnie. Drugi z EnableSessionremontami nieruchomości.

Czarodziej
źródło
Nie mogę dowiedzieć się, czy pierwszy w ogóle się kompiluje - wierzę, że tak nie jest. Drugi działa, ponieważ ustawiasz właściwość (po prostu jest to oczywiste tutaj XD).
MVCDS
@MVCDS Dlaczego uważasz, że nie powinno się go kompilować? Możesz znaleźć konstruktora publicznego WebMethodAttribute(Boolean)w dokumentach.
Warlock
Masz całkowitą rację. Czy zachowuje się inaczej, jeśli nie ustawisz nazwy parametru? Bo jeśli tak, stało się coś bardzo dziwnego, gdy tworzyli konstruktory (dla atrybutów).
MVCDS
1

Do włączenia sesji musimy użyć [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.";
    }


}

Teraz, aby odzyskać te nazwy za pomocą sesji, możemy przejść w ten sposób

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

    }

więc pobierze wszystkie nazwy z sesji i pokaże.

Debendra Dash
źródło
0

Możesz spróbować w ten sposób [WebMethod] public static void MyMethod (string ProductID, string Price, string Quantity, string Total) // Dodaj nowy parametr tutaj {db_class Connstring = new db_class (); próbować {

            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
źródło
0

W języku C # w kodzie za stroną przy użyciu metody internetowej

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

Na stronie 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;
                }
            });
Ramana
źródło