ฉันจะเข้าถึงเซสชันในวิธีการทางเว็บได้อย่างไร?


87

ฉันสามารถใช้ค่าเซสชันภายใน a ได้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

คุณได้รับข้อยกเว้นหรือไม่?
Darin Dimitrov

1
ในตัวอย่างด้านบนฉันไม่เห็นว่าคุณพยายามเข้าถึงค่าเซสชันใด ๆ คุณต้องตั้งค่าตัวแปรเซสชันก่อนจากนั้นจึงเข้าถึงได้เหมือนกับลิงก์ที่คุณโพสต์ return (int) เซสชัน ["Conversions"];
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 (เช่นไม่มีรายการใน Session) สำหรับฉันคำตอบอยู่ในคำถามการเปลี่ยน [WebMethod] เป็น [WebMethod (EnableSession = true)] ใช้ได้ผล ว๊อท!
BrainSlugs83

4
อย่าลืมกำหนดค่า web.config <sessionState mode = "InProc" />
Moesio

10

มีสองวิธีในการเปิดใช้งานเซสชันสำหรับ Web Method:

1. [WebMethod(enableSession:true)]

2. [WebMethod(EnableSession = true)]

อันแรกที่มีอาร์กิวเมนต์ตัวสร้างenableSession:trueไม่ได้ผลสำหรับฉัน อันที่สองกับEnableSessionงานอสังหา


ฉันคิดไม่ออกว่าคนแรกรวบรวม - ฉันเชื่อว่ามันไม่ อย่างที่สองทำงานได้เนื่องจากคุณกำลังตั้งค่าคุณสมบัติ (เห็นได้ชัดที่นี่ XD)
MVCDS

@MVCDS ทำไมถึงคิดว่าไม่ควรคอมไพล์ คุณสามารถค้นหาตัวสร้างสาธารณะได้WebMethodAttribute(Boolean)ในเอกสาร
Warlock

คุณพูดถูกจริงๆ มันทำงานแตกต่างกันหรือไม่หากคุณไม่ได้ตั้งชื่อพารามิเตอร์ เพราะถ้าเป็นเช่นนั้นมีบางอย่างที่แปลกมากเกิดขึ้นเมื่อพวกเขากำลังเข้ารหัสตัวสร้าง (สำหรับแอตทริบิวต์)
MVCDS

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] โมฆะคงที่สาธารณะ MyMethod (สตริง ProductID, ราคาสตริง, จำนวนสตริง, สตริงทั้งหมด) // เพิ่มพารามิเตอร์ใหม่ที่นี่ {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;
                }
            });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.