Як я можу отримати доступ до сеансу за допомогою веб-методу?


85

Чи можу я використовувати значення сеансу всередині a WebMethod?

Я спробував використовувати, System.Web.Services.WebMethod(EnableSession = true)але я не можу отримати доступ до параметра Session, як у цьому прикладі :

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

ось JS, який викликає webmethod:

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

4
Опублікування прикладу коду допоможе нам надати вам відповідь.
volpav

Ви отримуєте виняток?
Дарін Димитров

1
У наведеному вище прикладі я не бачу, щоб ви намагалися отримати доступ до будь-яких значень сеансу. Спочатку потрібно встановити var сеансу, а потім отримати до нього доступ, як посилання, яке ви опублікували. return (int) Session ["Конверсії"];
capdragon

@volpav він надав приклад коду.
BrainSlugs83,

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

Відповіді:


116

Ви можете використовувати:

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" />
Мезіо,

10

Існує два способи активувати сеанс для веб-методу:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

Перший з аргументом конструктора enableSession:trueдля мене не працює. Другий із EnableSessionмайном працює.


Я не можу зрозуміти, чи перший навіть компілюється - я би повірив, що це не так. Другий працює, оскільки ви встановлюєте властивість (просто очевидно тут XD).
MVCDS 02.03.15

@MVCDS Чому ви вважаєте, що його не слід компілювати? Ви можете знайти публічний конструктор WebMethodAttribute(Boolean)у документах.
Чернокнижник

Ви абсолютно праві. Чи поводиться він інакше, якщо ви не встановите ім'я параметра? Тому що якщо це відбувається, щось дуже дивне сталося, коли вони кодували конструктори (для атрибутів).
MVCDS 03.03.15

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 (рядок ProductID, рядок Price, рядок Quantity, рядок 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.