Wie kann ich in einer Webmethode auf eine Sitzung zugreifen?


85

Kann ich Sitzungswerte in a verwenden WebMethod?

Ich habe versucht, zu verwenden, System.Web.Services.WebMethod(EnableSession = true)aber ich kann nicht auf Sitzungsparameter wie in diesem Beispiel zugreifen :

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

Hier ist der JS, der die Webmethode aufruft:

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

4
Wenn Sie ein Codebeispiel veröffentlichen, erhalten Sie eine Antwort.
Volpav

Bekommst du eine Ausnahme?
Darin Dimitrov

1
Im obigen Beispiel sehen Sie nicht, dass Sie versuchen, auf Sitzungswerte zuzugreifen. Sie müssen zuerst die Sitzungsvariable festlegen und dann wie über den von Ihnen geposteten Link darauf zugreifen. return (int) Session ["Conversions"];
Capdragon

@volpav er lieferte Beispielcode.
BrainSlugs83

Nein, @capdragon, die Session-Eigenschaft der Seite ist für statische Methoden nicht vorhanden (WebMethods müssen statisch sein). Er fragt, wo sich die Eigenschaft befindet. Wie unten angegeben, befindet sie sich im aktuellen HttpContext.
BrainSlugs83

Antworten:


116

Sie können verwenden:

HttpContext.Current.Session

Es wird jedoch sein, nulles sei denn, Sie geben auch an EnableSession=true:

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

18
Ironischerweise habe ich das schon gemacht - nur hat es bei mir nicht funktioniert. HttpContext.Current.Session.Count gab 0 zurück (dh keine Elemente in der Sitzung). Für mich war die Antwort in der Frage, dass das Ändern von [WebMethod] in [WebMethod (EnableSession = true)] funktioniert hat. Woot!
BrainSlugs83

4
Denken Sie daran, web.config <sessionState mode = "InProc" />
Moesio

10

Es gibt zwei Möglichkeiten, die Sitzung für eine Webmethode zu aktivieren:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

Das erste mit Konstruktorargument enableSession:truefunktioniert bei mir nicht. Der zweite mit EnableSessionEigentum funktioniert.


Ich kann nicht herausfinden, ob der erste überhaupt kompiliert - ich würde glauben, dass dies nicht der Fall ist. Der zweite funktioniert, weil Sie die Eigenschaft festlegen (hier nur XD offensichtlich).
MVCDS

@MVCDS Warum sollte es Ihrer Meinung nach nicht kompiliert werden? Sie finden einen öffentlichen Konstruktor WebMethodAttribute(Boolean)in Dokumenten.
Hexenmeister

Du hast absolut recht. Verhält es sich anders, wenn Sie den Parameternamen nicht festlegen? Denn wenn doch, passierte etwas sehr Seltsames, als sie Konstruktoren (für Attribute) codierten.
MVCDS

1

Für die Aktivierungssitzung müssen wir [WebMethod (enableSession: true)] verwenden.

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


}

Um diese Namen jetzt mithilfe der Sitzung abzurufen, können wir so vorgehen

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

    }

Es werden also alle Namen aus der Sitzung abgerufen und angezeigt.


0

Sie können dies wie folgt versuchen: [WebMethod] public static void MyMethod (Zeichenfolge ProductID, Zeichenfolge Price, Zeichenfolge Quantity, Zeichenfolge Total) // Neuen Parameter hier hinzufügen {db_class Connstring = new db_class (); Versuchen {

            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

In C # auf Code hinter der Seite mit der Webmethode

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

Und auf der Aspx-Seite

$.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;
                }
            });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.