Почему WebMethod Access Session State без EnableSessionState?
У меня есть метод на странице, помеченной как [WebMethod]
, которая использует некоторое состояние сеанса как часть его работы. После того, как я написал этот код, у меня внезапно появилась вспышка памяти, что вам нужно использовать EnableSessionState
, когда вы используете состояние сеанса в [WebMethod]
(например, см. Здесь: http://msdn.microsoft.com/en-us/library/byxd99hx.aspx). Но, похоже, он работает нормально. Почему?
Пример кода:
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"];
}
Пример body 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>
Ответы
Ответ 1
В 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 (что вы, вероятно, уже знаете).
Ответ 2
http://forums.asp.net/t/1630792.aspx/1
Ответа на этот вопрос gsndotnet:
Вы правы, но все, что вы говорите, применимо к методу в контексте WebServices. Мы также используем тот же атрибут WebMethod для методов WebService (.asmx). Поэтому в контексте веб-служб, когда мы хотим разрешить доступ к сеансу, мы должны добавить EnableSession = true. Если в контексте PageMethods они уже имеют доступ к сеансу, поскольку они определены внутри класса, который наследуется от класса Page.
Ваша ссылка msdn означает, что вы используете веб-службу, то есть класс, полученный из System.Web.Services.WebService.
В коде вы добавляете свой метод непосредственно на страницу, поэтому он имеет доступ к сеансу.