2013-03-22 43 views
12

Tôi có một phương pháp trên trang được đánh dấu là [WebMethod] sử dụng một số trạng thái phiên làm một phần của hoạt động của nó. Sau khi tôi viết mã này, tôi đột nhiên có một bộ nhớ flash mà bạn cần sử dụng EnableSessionState khi bạn sử dụng trạng thái phiên trong một [WebMethod] (ví dụ: xem tại đây: http://msdn.microsoft.com/en-us/library/byxd99hx.aspx). Nhưng nó có vẻ hoạt động tốt. Tại sao?Tại sao có thể truy cập WebMethod Session State mà không có EnableSessionState?

đang

mẫu sau:

protected void Page_Load(object sender, EventArgs args) { 
    this.Session["variable"] = "hey there"; 
} 
[System.Web.Services.WebMethod] 
public static string GetSessionVariable() { 
    return (string)HttpContext.Current.Session["variable"]; 
} 

Mẫu nội dung html:

<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    function getSession() { 
     $.ajax({ 
      type: 'POST', 
      url: 'Default.aspx/GetSessionVariable', 
      data: '{ }', 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json', 
      success: function (msg) { 
       document.getElementById("showSessionVariable").innerHTML = msg.d; 
      } 
     }); 
     return false; 
    } 
</script> 
<form id="form1" runat="server"> 
    <div id="showSessionVariable"></div> 
    <button onclick='return getSession()'>Get Session Variable</button> 
</form> 

Trả lời

15

Trên http://msdn.microsoft.com/en-us/library/system.web.services.webmethodattribute.enablesession(v=vs.90).aspx, bạn sẽ thấy rằng điều này áp dụng cho các dịch vụ Web XML (tức là, các lớp bắt nguồn từ System.Web.Services.WebService).

[WebMethod(EnableSession=true)] 

Vì trang của bạn có lẽ mở rộng System.Web.UI.Page, không cần thiết phải bật phiên rõ ràng. Trên http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx, bạn có thể thấy rằng EnableSessionState được bật theo mặc định cho Trang (mà bạn có thể đã biết).

3

http://forums.asp.net/t/1630792.aspx/1

trả lời của gsndotnet: Bạn nói đúng nhưng bất cứ điều gì bạn đang nói là áp dụng đối với một phương pháp trong bối cảnh của WebServices. Chúng tôi cũng sử dụng cùng một thuộc tính WebMethod trên các phương thức của một WebService (.asmx). Vì vậy, trong ngữ cảnh của các dịch vụ Web khi chúng ta muốn cho phép truy cập Session, chúng ta phải thêm EnableSession = true. Trong khi trong ngữ cảnh của PageMethods họ đã có quyền truy cập vào Session khi chúng được định nghĩa bên trong một lớp kế thừa từ lớp Page.

Liên kết msdn của bạn có nghĩa là bạn sử dụng dịch vụ web, tức là lớp học được lấy từ System.Web.Services.WebService. Trong mã của bạn, bạn thêm phương thức của bạn trực tiếp trên trang, vì vậy nó có quyền truy cập vào phiên.