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

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

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.


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.


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


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;
                }
            });
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.