Почему WebMethod может получить доступ к состоянию сеанса без 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"];
}

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

2 ответа

Решение

На 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 включен по умолчанию для страниц (что вы, вероятно, уже знаете).

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

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

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

Другие вопросы по тегам