• Microsoft .NET
  • ASP.NET
  • Периодическое обновление экрана и заголовка веб-страницы при помощи ASP.NET AJAX

Периодическое обновление экрана и заголовка веб-страницы при помощи ASP.NET AJAX - Общий обзор способа периодического обновления экрана и заголовка

ОГЛАВЛЕНИЕ

Общий обзор способа периодического обновления экрана и заголовка

До того, как мы окунемся в детали обновления экрана и заголовка страницы числом незавершенных заданий текущего пользователя, давайте в общем рассмотрим необходимое решение. Нам нужен какой-то способ, при котором страница могла бы связаться с сервером и спросить -- "сколько незавершенных заданий у текущего пользователя?", и нам нужно периодически задавать этот вопрос, к примеру, каждые 30 секунд. Более того, при получении ответа на данный вопрос, нам необходимо отобразить текст в верхнем левом углу и обновить заголовок страницы.

В статье о получении данных с сервера при помощи веб-сервисов мы рассмотрели способ эффективного взаимодействия с сервером из JavaScript, используя программный интерфейс (API) клиентской   стороны структуры ASP.NET AJAX . Вкратце, вы можете создать веб-сервис и сделать его доступным для скрипта клиентской стороны, наделив его атрибутом ScriptService. Более того, вы можете создать прокси-класс JavaScript, регистрируя скрипт в секции Scripts ScriptManager. Поэтому мы уже знаем, как создать такой сервис и как вызвать его из JavaScript. Но как создать сервис, вызываемый каждые n секунд?

JavaScript включает в себя функцию, названную setInterval(code, timeout), которая выполняет code каждые timeout миллисекунд. Поэтому, мы можем использовать данную функцию для вызова веб-сервиса каждые 30 секунд (либо любое другое количество секунд ).Обновление текста количества невыполненных заданий в заголовке страницы заключается в написании парочки строк на языке JavaScript. Вы можете использовать объектную модель документов (Document Object Model - DOM) для программной ссылки на HTML-элемент и затем модифицировать экран при помощи свойства innerHTML. Заголовок страницы может быть считан и изменен посредством свойства document.title.

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

Первым шагом будет создание веб-сервиса, который возвращает число незавершенных заданий текущего пользователя. Создайте новый веб-сервис, наделите его атрибутом ScriptService и затем добавьте следующий метод:

<WebMethod()> _
Public Function GetOpenWorkOrders() As String
   Dim results As Integer = -1

   'Получение информации о пользователе
   Dim userInfo As MembershipUser = Membership.GetUser()
   If userInfo IsNot Nothing Then
      Dim userId As Guid = userInfo.ProviderUserKey

      'Получение числа незавершенных заданий для данного пользователя
      Using myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
         Const sql As String = "SELECT COUNT(*) FROM WorkItems WHERE UserId = @UserId AND DateCompleted IS NULL"

         Dim myCommand As New SqlCommand(sql, myConnection)
         myCommand.Parameters.AddWithValue("@UserId", userId)

         myConnection.Open()
         results = Convert.ToInt32(myCommand.ExecuteScalar())
         myConnection.Close()
      End Using
   End If

   Return results
End Function

Когда клиентское приложение вызывает веб-сервис оно передает файл-куки (cookies). Поскольку данный сайт использует авторизацию, основанную на форме, то когда пользователь авторизируется на сайте жетон аутентификации будет добавлен в набор куки (cookies collection), тем самым пользователь может быть идентифицирован при последующих запросах. Следовательно, мы можем определить пользователя, вызывающего веб-сервис (если он уже авторизировался) по данному жетону в файле-куки. Конечно, нам не нужно создавать код проверки жетона авторизации пользователя - вместо этого, все это делается "за занавесом" движком ASP.NET. Мы можем получить информацию об авторизированном пользователе просто вызвав Membership.GetUser() или из свойства User.Identity.

Метод указанного выше веб-сервиса начинается с вызова метода Membership.GetUser(). Если данный метод возвращает Nothing , то человек, совершающий данный вызов веб-сервиса анонимен. В таком случае метод возвращает значение -1. Но если пользователь авторизирован, то его значение UserId будет получено из свойства ProviderUserKey объекта MembershipUser и затем использовано в SQL-запросе, который возвращает число незавершенных заданий. Данное число и будет возвращено.

Чтобы вызвать веб-сервис из JavaScript нам необходимо зарегистрировать его в элементе ScriptManager. (ScriptManager, а также JavaScript , которые будут рассмотрены далее в статье, содержатся в мастер-странице, Site.master). Декларативная разметка элемента ScriptManager будет выглядеть следующим образом:

<asp:ScriptManager ID="myScriptManager" runat="server">
   <Services>
      <asp:ServiceReference Path="~/Services/WebsiteServices.asmx" />
   </Services>
</asp:ScriptManager>