Управление состоянием сеанса

Иногда веб-службы критикуются за то, что, несмотря на все свое великолепие, данная технология не имеет ничего общего собственно с Веб.

Однако поскольку веб-службы .NET эффективно интегрированы с ASP.NET, то при использовании ASP.NET у вас есть возможность создавать сценарии, которые не могли бы быть реализованы только на основе технологии веб-служб.

Например, с помощью веб-служб .NET можно управлять состоянием сеансов. И это состояние, если используется технология Ajax, может быть доступно из приложения ASP.NET AJAX. Так, платформа ASP.NET AJAX предоставляет возможность разным Ajax-приложениям, работающим на одном и том же сервере, совместно использовать информацию об одном и том же пользователе.

Реализация подобной возможности выглядит гораздо проще, чем ее описание. Вся хитрость заключается в свойстве EnableSession атрибута [WebMethod], который используется при объявлении веб?методов .NET:
[WebMethod(EnableSession=true)]

После такого объявления вы получаете возможность обращаться непосредственно к объекту Session платформы ASP.NET и читать или записывать данные в него. Поскольку все веб?методы объявляются как статические, вместо простого имени массива Session нужно использовать массив HttpContext.Current.Session, который доступен только в фактических экземплярах класса Page.

В следующем фрагменте иллюстрируются две функции: одна сохраняет текущее время в сеансе, а другая определяет разницу между текущим временем и меткой времени (timestamp), сохраненной в сеансе.

Если метки времени в сеансе нет, возвращается значение -1.
[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod]
public static bool SaveTime()
{
HttpContext.Current.Session["PageLoaded"] = DateTime.Now;
return true;
}
[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod]
public static double CalculateDifference()
{
if (HttpContext.Current.Session["PageLoaded"] == null) {
return ?1;
} else {
DateTime then = (DateTime)HttpContext.Current.Session["PageLoaded"];
TimeSpan diff = DateTime.Now.Subtract(then);

return diff.TotalSeconds;
}
}

Теперь вернемся к приложению, которое выполняет деление двух чисел.


Когда будет загружена страница, содержащая фрагмент, приведенный выше, и произойдет вызов метода SaveTime(), внутри сеанса будет сохранено текущее время. Во время выполнения операции деления будет вычислена разность между двумя значениями времени. Это даст возможность определить, какой промежуток времени прошел между открытием формы и запросом на выполнение операции деления (конечно, то же самое можно было бы сделать обычными средствами JavaScript, но для демонстрации мы используем обходной путь через сервер).

Следующий фрагмент программного кода на JavaScript сразу после загрузки страницы сохраняет текущее время вызовом метода SaveTime() веб-службы. Поскольку возвращаемое значение этого метода не представляет никакого интереса, мы можем использовать функцию обратного вызова, которая ничего не делает.

function pageLoad(){
PageMethods.SaveTime(doNothing, doNothing);
}
function doNothing(result) {
// ничего не делает :?)
}

Как уже было показано ранее, чтобы вызвать метод CalculateDifference() веб?службы, необходимо обратиться к методу callService().

В следующем фрагменте производится вызов двух методов веб-службы.


Первый вычисляет разницу между временем загрузки страницы и текущим временем. Второй выполняет ту же арифметическую операцию, что и раньше.

function callService(f) {
document.getElementById("c").innerHTML = "";
PageMethods.CalculateDifference(
showDifference,
callError);
PageMethods.DivideNumbers(
parseInt(f.elements["a"].value),
parseInt(f.elements["b"].value),
callComplete,
callError);
}

Наконец, необходимо предусмотреть код разметки для отображения разности времен. Для этих целей мы будем использовать контейнер
со значением атрибута "id=output". Обратите внимание: когда веб-метод возвращает значение ?1, это означает, что текущее время не было сохранено в сеансе и потому разность времен не может быть вычислена.

function showDifference(result) {
if (result != ?1) {
document.getElementById("output").innerHTML =
"The form has been open for " + result + " seconds";
}
}

Полный код разметки и текст сценария, которые необходимо реализовать, приводятся в примере 5.4, а все сделанные изменения выделены жирным шрифтом.


Обратите внимание: для элемента управления ScriptManager, как и прежде, необходимо установить атрибут EnablePageMethods="true". Если этот атрибут не установлен, методы страницы не будут работать.

Пример 5.4. Управление состоянием сеанса средствами ASP.NET AJAX и ASP.NET
WebServiceSession.aspx

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Web.Services" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd">
ASP.NET AJAX


(body)
(asp:ScriptManager ID="ScriptManager1" runat="server"
EnablePageMethods="true")
(/asp:ScriptManager)



/

=

(br /)
onclick="callService(this.form);" />
(br /)



(/body)


При вызове из броузера метода DivideNumbers() можно заметить два отличия от предыдущих примеров. Первое: веб-сервер отправляет сеансовый cookie (если в файле Web.config вы не задали использование сеансов без cookie). Если броузер настроен на запрос подтверждения перед приемом cookie, вы увидите диалог. Второе: при обращении к веб-службе производится сохранение данных сеанса.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Веб-службы и Internet Explorer
Веб-службы и броузеры Mozilla
Веб-службы и броузеры обоих типов
Доступ к веб-службам из JavaScript
Методы страницы

Вернуться в раздел: ASP.NET AJAX / Веб-службы