How can I access session in a webmethod?
Asked Answered
G

6

95

Can i use session values inside a WebMethod?

I've tried using System.Web.Services.WebMethod(EnableSession = true) but i can't access Session parameter like in this example:

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

here's the JS who calls the webmethod:

    $.ajax({
        type: "POST",
        url: 'Catalogo.aspx/checaItem',
        data: "{ id : 'teste' }",
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            alert(data);
        }
    });
Goree answered 21/1, 2011 at 12:3 Comment(7)
Posting a code example will help us provide you with an answer.Smarm
Are you getting an exception?Spice
In the example above i don't see you trying to access any session values. You need to set the session var first then access it like the link you posted. return (int) Session["Conversions"];Linhliniment
@Smarm he provided example code.Sulphuric
No, @Linhliniment the Page's Session property doesn't exist for static methods (WebMethods are required to be static) -- he's asking where to find the property -- as posted below, it lives in the current HttpContext.Sulphuric
+1 I got soln from this page.Reconstructionist
@Sulphuric WebMethods definitely do not have to be static and Session not working has nothing to do with the method being static. Session["key"] is shorthand for Page.Session["key"]. Page doesn't exist here because the class is derived from the WebService class instead of the Page class that aspx pages are derived from.Johnette
C
132

You can use:

HttpContext.Current.Session

But it will be null unless you also specify EnableSession=true:

[System.Web.Services.WebMethod(EnableSession = true)]
public static String checaItem(String id)
{ 
    return "zeta";
}
Clingstone answered 21/1, 2011 at 14:50 Comment(2)
Ironically, this is what I was already doing -- only it wasn't working for me. HttpContext.Current.Session.Count was returning 0 (i.e. no items in Session). For me, the answer was in the question, changing [WebMethod] to [WebMethod(EnableSession = true)] worked. Woot!Sulphuric
Remember to config web.config <sessionState mode="InProc"/>Plural
P
10

There are two ways to enable session for a Web Method:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

The first one with constructor argument enableSession:true doesn't work for me. The second one with EnableSession property works.

Paz answered 21/10, 2013 at 11:4 Comment(4)
I cannot figure out if the first one even compiles - I'd belive it doesn't. The second does work because you are setting the property (just being obvious here XD).Beating
@Beating Why do you think that it should not be compiled? You can find a public constructor WebMethodAttribute(Boolean) in docs.Paz
You're absolutely right. Does it behaves differently if you don't set the parameter name? Because if it does, something very weird happened when they were coding constructors (for attributes).Beating
This is not working for me in Visual Studio 2022 for .Net Framework 4.Hypopituitarism
S
1

For enable session we have to use [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.";
    }


}

Now to retrive these names using session we can go like this

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

    }

so it will retrive all the names from the session and show.

Sequin answered 10/11, 2016 at 9:50 Comment(0)
M
0

You can try like this [WebMethod] public static void MyMethod(string ProductID, string Price, string Quantity, string Total)// Add new parameter Here { db_class Connstring = new db_class(); try {

            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;
        }
    }
Mcguinness answered 23/5, 2016 at 17:53 Comment(0)
G
0

Take a look at you web.config if session is enabled. This post here might give more ideas. https://mcmap.net/q/225151/-why-can-webmethod-access-session-state-without-enablesessionstate

Gabbert answered 1/9, 2016 at 11:41 Comment(0)
S
0

In C#, on code behind page using web method,

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

And, in aspx page,

$.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;
                }
            });
Sagittal answered 20/6, 2020 at 12:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.