2013-03-22 28 views
12

Mam metodę na stronie oznaczonej jako [WebMethod], który używa pewien stan sesji jako część jego działania. Po tym, jak napisałem ten kod, nagle miałem pamięć flash, która wymaga użycia EnableSessionState, gdy używasz stanu sesji w [WebMethod] (np. Patrz tutaj: http://msdn.microsoft.com/en-us/library/byxd99hx.aspx). Ale wygląda na to, że działa dobrze. Czemu?Dlaczego WebMethod może uzyskać dostęp do stanu sesji bez EnableSessionState?

kod

próbki za:

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"]; 
} 

Próbka ciała 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> 

Odpowiedz

15

Na stronie http://msdn.microsoft.com/en-us/library/system.web.services.webmethodattribute.enablesession(v=vs.90).aspx widać, że dotyczy to usług sieci Web XML (tj. Klas pochodzących z System.Web.Services.WebService).

[WebMethod(EnableSession=true)] 

Ponieważ twoja strona prawdopodobnie rozszerza System.Web.UI.Page, nie jest konieczne jawne włączenie sesji. Na stronie http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx widać, że opcja EnableSessionState jest domyślnie włączona dla stron (co prawdopodobnie już wiesz).

3

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

Odpowiedź gsndotnet: Masz rację, ale co pan mówi, jest zastosowanie metody w kontekście WebServices. Używamy również tego samego atrybutu WebMethod na metodach WebService (.asmx). Dlatego w kontekście usług internetowych, gdy chcemy zezwolić na dostęp do sesji, musimy dodać EnableSession = true. Natomiast w kontekście PageMethods mają już dostęp do Session, ponieważ są one zdefiniowane w klasie, która dziedziczy po klasie Page.

Twój link msdn oznacza, że ​​korzystasz z usługi WWW, tj. Klasy pochodzącej z System.Web.Services.WebService. W kodzie dodajesz swoją metodę bezpośrednio na stronie, dzięki czemu ma dostęp do sesji.