Как я могу получить доступ к сеансу с помощью веб-метода?


87

Могу ли я использовать значения сеанса внутри WebMethod?

Я пробовал использовать, System.Web.Services.WebMethod(EnableSession = true)но не могу получить доступ к параметру сеанса, как в этом примере :

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

вот JS, который вызывает веб-метод:

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

4
Размещение примера кода поможет нам дать вам ответ.
volpav

Вы получаете исключение?
Дарин Димитров

1
В приведенном выше примере я не вижу, чтобы вы пытались получить доступ к каким-либо значениям сеанса. Сначала вам нужно установить переменную сеанса, а затем получить к ней доступ, как ссылку, которую вы разместили. return (int) Сессия ["Конверсии"];
capdragon

@volpav он предоставил пример кода.
BrainSlugs83

Нет, @capdragon свойство сеанса страницы не существует для статических методов (WebMethods должны быть статическими) - он спрашивает, где найти свойство - как указано ниже, оно находится в текущем HttpContext.
BrainSlugs83

Ответы:


119

Вы можете использовать:

HttpContext.Current.Session

Но это будет, nullесли вы также не укажете EnableSession=true:

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

18
По иронии судьбы, это то, чем я уже занимался - только у меня это не сработало. HttpContext.Current.Session.Count возвращал 0 (т.е. нет элементов в сеансе). Для меня ответ заключался в вопросе, изменение [WebMethod] на [WebMethod (EnableSession = true)] сработало. Woot!
BrainSlugs83

4
Не забудьте настроить web.config <sessionState mode = "InProc" />
Moesio

10

Есть два способа включить сеанс для веб-метода:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

Первый с аргументом конструктора enableSession:trueу меня не работает. Второй с EnableSessionсобственностью работает.


Я не могу понять, компилируется ли первый - я бы поверил, что это не так. Второй действительно работает, потому что вы устанавливаете свойство (здесь это просто XD).
MVCDS 02

@MVCDS Почему вы думаете, что его не надо компилировать? Вы можете найти публичный конструктор WebMethodAttribute(Boolean)в документации.
Warlock

Вы совершенно правы. Будет ли вести себя иначе, если вы не укажете имя параметра? Потому что, если это так, происходит что-то очень странное, когда они кодируют конструкторы (для атрибутов).
MVCDS 03

1

Для включения сеанса мы должны использовать [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.";
    }


}

Теперь, чтобы получить эти имена с помощью сеанса, мы можем сделать это так

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

    }

поэтому он извлечет все имена из сеанса и покажет.


0

Вы можете попробовать вот так [WebMethod] public static void MyMethod (string ProductID, string Price, string Quantity, string Total) // Добавить новый параметр Здесь {db_class Connstring = new db_class (); пытаться {

            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

В C # на странице кода за страницей с использованием веб-метода

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

И на странице 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;
                }
            });
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.