2013-03-22 3 views
12

У меня есть метод на странице, помеченной как [WebMethod], которая использует некоторое состояние сеанса как часть его работы. После того, как я написал этот код, у меня внезапно появилась вспышка памяти, в которой вы используете EnableSessionState, когда используете состояние сеанса в [WebMethod] (например, см. Здесь: http://msdn.microsoft.com/en-us/library/byxd99hx.aspx). Но, похоже, он работает нормально. Зачем?Почему WebMethod Access Session State без EnableSessionState?

Пример кода позади:

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

Пример тела 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> 

ответ

15

На странице http://msdn.microsoft.com/en-us/library/system.web.services.webmethodattribute.enablesession(v=vs.90).aspx вы увидите, что это относится к веб-службам XML (т. Е. К классам, полученным из System.Web.Services.WebService).

[WebMethod(EnableSession=true)] 

Поскольку ваша страница предположительно распространяется System.Web.UI.Page, не нужно явно включить сеанс. На странице http://msdn.microsoft.com/en-us/library/system.web.configuration.pagessection.enablesessionstate.aspx вы можете видеть, что EnableSessionState включен по умолчанию для Pages (что вы, вероятно, уже знаете).

3

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

Ответ gsndotnet: Вы правы, но все, что вы говорите, относится к способу в контекст WebServices. Мы также используем тот же атрибут WebMethod для методов WebService (.asmx). Поэтому в контексте веб-служб, когда мы хотим разрешить доступ к сеансу, мы должны добавить EnableSession = true. В то время как в контексте PageMethods они уже имеют доступ к Session, поскольку они определены внутри класса, который наследуется от класса Page.

Ваша ссылка msdn означает, что вы используете веб-службу, то есть класс, полученный из System.Web.Services.WebService. В вашем коде вы добавляете свой метод непосредственно на страницу, чтобы он имел доступ к сеансу.

Смежные вопросы