Atlas, первые шаги
Вступление
Что же такое AJAX? AJAX буквально расшифровывается как Asynchronous JavaScript And XML - асинхронный JavaScript и XML. Что это за чудо? Думаю, лучше всего об этом написано в Википедии. Я лишь приведу цитату:AJAX (Asynchronous JavaScript and XML) — подход к построению пользовательских интерфейсов веб-приложений, при котором web-страница, не перезагружаясь, сама догружает нужные пользователю данные. AJAX — один из компонентов концепции DHTML. Об Ajax заговорили после появления в феврале 2005-го года статьи Джесси Джеймса Гарретта (Jesse James Garrett) «Новый подход к веб-приложениям». Ajax — не самостоятельная технология. Это идея. Ajax подход к разработке пользовательских интерфейсов базируется на двух основных принципах.Приложение AJAX состоит из двух частей:Использование этих двух подходов позволяет создавать намного более удобные веб-интерфейсы пользователя на тех страницах сайтов, где необходимо активное взаимодействие с пользователем. Использование Ajax стало наиболее популярно после того как компания Google начала активно использовать его при создании своих сайтов, таких как Gmail, Google maps и Google suggest. Создание этих сайтов подтвердило эффективность использования данного подхода.
- Использование DHTML для динамичного изменения содержания страницы.
- Использование XMLHttpRequest для обращения к серверу «на лету», не перезагружая всю страницу полностью (также существует альтернативный вариант — динамическая подгрузка JavaScript с использованием DOM).
- Клиент - это код HTML и JavaScript.
- Сервер - это часть, которая взаимодействует со страничками и имеет доступ к данным.
- Браузер загружает клиентскую страницу.
- При взаимодействии с интерфейсом страницы JavaScript асинхронно передаёт и принимает данные от сервера в формате XML.
- Браузер, а точнее, движок AJAX-приложения на JavaScript, обрабатывает данные, полученные от сервера и динамически меняет UI страницы.
Что же такое Atlas?
Atlas - это свободная реализация AJAX от Microsoft для ASP .NET. В чём её преимущества?- Во-первых, она позволяет оформить серверную часть как Web-сервис.
- Во-вторых, благодаря специальным скриптам, в JavaScript появляется некий аналог ООП: возможно наследование, реализация интерфейсов и т.д.
- В-третьих, разработчику практически ничего не нужно знать про внутреннюю работу Atlas.
- В-четвёртых, не нужно писать код для поддержки различных браузеров - он встроен в Atlas.
Приготовления
На данный момент Atlas находится в состоянии разработки. Но это вовсе не значит, что им ещё рано пользоваться. Напротив - чем раньше Вы начнёте использовать его, тем лучше. На данный момент Atlas распространяется свободно (и будет распространяться), скачать самый новый дистрибутив всегда можно здесь. Hello, World! После того, как Вы установили Atlas, в шаблонах сайтов в Visual Studio появится новая иконка - ASP .NET 'Atlas' Web Site. Нажмите "ОК". У Вас появится страница Default.aspx, папка ScriptLibrary и библиотека Microsoft.Web.Atlas.dll в папке Bin. Также Atlas модифицирует файл web.config. Собственно говоря, в папке ScriptLibrary хранятся все скрипты, необходимые для работы Atlas. В библиотеке Microsoft.Web.Atlas.dll хранятся серверные компоненты, о них мы поговорим позднее. Для начала, мы создадим простенький Web-сервис a la Hello, World. Добавьте в проект новый Web-сервис и назовите его WebService.asmx. В codebehind этого сервиса добавьте следующие строчки: VB.Net
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Namespace AtlasTest
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
Public Class WebService
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function HelloWorld() As String
Return "Hello, World!"
End Function
End Class
End Namespace
c#
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
namespace AtlasTest
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello, World!";
}
}
}
Как видно, наш Web-сервис содержит один лишь метод HelloWorld(), который возвращает строку "Hello, World!".
Далее, напишите в самом asmx-файле сервиса следующую строку:
<%@ WebService Language="VB" CodeBehind="~/App_Code/WebService.vb" Class="AtlasTest.WebService" %>
Всё, наш Web-сервис готов!
Теперь зайдите в Source странички Default.aspx. И немного наберитесь терпения.
Для начала нам необходимо познакомиться с самым важным компонентом Atlas - ScriptManager. Его работа - управлять скриптами Atlas и подключать необходимые к странице. Тег <atlas:ScriptManager> имеет три внутренних тега. Сейчас мы их рассмотрим чуть поближе.
- ErrorTemplate - темплэйт, куда записывается сообщение, выскакивающее при ошибке. Он нам сейчас не понадобится.
- Scripts - секция, через которую мы можем подключить пользовательские скрипты.
- Services - секция, через которую мы можем подключить Web-сервисы к странице.
<atlas:ScriptManager ID="MainScriptManager" runat="server">
<Services>
<atlas:ServiceReference Path="WebService.asmx" />
</Services>
</atlas:ScriptManager>
Прекрасно, мы подключили Web-сервис к нашей странице. Теперь добавьте на страницу следующий код:
<input type="button" value="Послать запрос" onclick="SendQuery();" />
<div id="Result" />
У нас появится два новых элемента на странице - кнопка "Послать запрос" и div. Как Вы, наверное, уже догадались по его неоднозначному имени, в нём будет отображаться результат запроса.
При нажатии на кнопку вызывается функция JavaScript, которую мы сейчас напишем.
Добавьте в секцию head пустой тег script:
<script type="text/javascript">
</script>
Теперь можно писать функции. Код JavaScript выглядит так:
function SendQuery()
{
// Мы вызываем наш Web-сервис, передавая ему
// функцию, которая вызывается по получении ответа
AtlasTest.WebService.HelloWorld(onRequestComplete);
}
function onRequestComplete(result)
{
// Мы находим тот div
var ourDiv = document.getElementById("Result");
// Заполняем его информацией от Web-сервиса
ourDiv.innerHTML = result;
}
Как видно, код прост до невозможности. Как и ожидалось, после нажатия кнопки под ней повилась надпись "Hello, World!".
Проверить асинхронность можно очень легко: модифицируйте Web-сервис, добавив в код Web-сервиса команду
VB.Net
System.Threading.Thread.Sleep(5000)
C#
System.Threading.Thread.Sleep(5000);
Вы можете спокойно просматривать страницу, а в это время код JavaScript ожидает ответа от сервера.
В следующей статье мы поговорим об автозаполнении TextBox'ов, как в Gmail.
Полный код страницы:
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function SendQuery()
{
AtlasTest.WebService.HelloWorld(onRequestComplete);
}
function onRequestComplete(result)
{
var ourDiv = document.getElementById("Result");
ourDiv.innerHTML = result;
}
</script>
</head>
<body>
<form id="mainForm" runat="server">
<atlas:ScriptManager ID="MainScriptManager" runat="server">
<Services>
<atlas:ServiceReference Path="WebService.asmx" />
</Services>
</atlas:ScriptManager>
<div>
<input type="button" value="Послать запрос" onclick="SendQuery();" />
<div id="Result" />
</div>
</form>
</body>
</html>
Успехов!
Еще об этом:
Обсудите эту новость на news2.ru…
…
Спасибо!
Всё клёва работает
10x!
Клёво-то клёво… Я, может, невнимательно смотрел все те статьи про Atlas, которые смог найти, но кто-нибудь может мне сказать, как сослаться на УДАЛЁННЫЙ Web-сервис? Не тот, который вы тут же в проекте и создали, а совершенно отдельно (на другом сервере, например) стоящий? По абсолютному адресу типа типа http://ля-ля-ля/жу-жу-жу/MyService.asmx?
так берешь в ScriptManager в разделе services ставишь atlas:ServiceReference и параметр Path. там, соответственно и пишешь абсолютный путь. разницы-то?
Разница в том, что при этом происходит ошибка сценария в строчке вызова Web-метода (AtlasTest.WebService.HelloWorld(onRequestComplete) в случае приведённого в статье примера). Для этого вызова она выглядела бы как “‘AtlasTest.WebService’ is undefined”. Сразу оговорюсь, что в случае с локальным сервисом всё работает правильно и при указании абсолютного пути. А вот при ссылке на посторонний сервер – фиг. Я так подозреваю, что в этом случае на самом деле proxy корректно не генерится, но ошибка вверх не передаётся…
хм… скинь проект на boris.bogdanov (мокрый нос, длинный хвост) gmail com
Дык толку его скидывать – он extranet’овский, все сервисы (и серверы) внутрикорпоративные. Собственно, такое поведение нетрудно воссоздать даже для приведённого примера – стоит только опубликовать сервис отдельно от UI. Я вот уже думаю – может, тут проблема с аутентификацией? Мой сервис анонимов не приемлет, требует Windows Authentication. А UI – анонимный. Мож, в этом дело? Ща попробую. Хотя, конечно, вряд ли – тут же вызов идёт с клиента…
Ну вот всё и разрещилось
Меня ввела в заблуждение фраза “Web services that work with ‘Atlas’ applications are not different from other ASP.NET Web services. ‘Atlas’ applications can run in any browser and connect to any type of Web-based service; the server does not have to be running ASP.NET or Windows” из статьи “Hello World Using Client Script” на сайте Atlas’a. Ну, я, ясное дело, честно попытался приконнектиться к своему давно существующему сервису. И не смог. А потом в статье “ASP.NET Atlas” – AJAX в исполнении Microsoft” Игоря Тамащука нашёл такую фразу : “Таким образом, мы делаем вывод, что использование сторонних web-сервисов, НЕ ПРИСПОСОБЛЕННЫХ (выделено мной) для работы с Atlas-клиентами – невозможно в принципе”. O-o-ops! Я проверил это утверждение, создав отдельно стоящий Web-сервис как Atlas-проект и – о чудо! – всё заработало
Ещё раз убеждаюсь в правильности совета НЕ ОЧЕНЬ внимательно читать статьи Microsoft, чтобы (случайно) не принять желаемое за действительное…
Охренеть. Т.е. через Atlas не получить информации, скажем, от Amazon WebServices?! Если честно, то не верится, проверю. Но если действительно так, то просто слов нет.
Я думаю, это ПОКА так. Теоретически никаких препятствий к работе с любыми сервисами быть не должно. Надеюсь, что к моменту релиза Atlas будет работать так, как это и декларировалось с самого начала.
Хм.. Рад, кто кому-то понравилось
. Что-то мне не верится, что оно не работает с другими сервисами, WSDL ведь никто не менял.. Думаю, проблема не в атласе.
Короче, мужики, не знаю как там на счёт атласа, а вот ASP.NET AJAX 1.0 RC не только “не работает с другими сервисами” но и со своими на других сайтах. Я в шоке. Короче делаю следующее. Создаю ASP.NET AJAX-Enabled Web Site, добавляю в него веб-сервис – всё пашет замечательно. Деалю копию папки с сайтом. И труба. С копией он уже работать не хочет. И вообще я нашёл такую строку в документации: The element can reference a Web service only in the same domain.
Ну и что мне теперь делать? Создать веб сёрвис на томже серваке где аякс, и чтобы он дёргал веб сёрвис на другом серваке? Но это же идиотизм
Кароче перцы из MS почему-то не сделали генератор клиентских прокси для soap сервисов. Вызывать их методы конечно можно (насколько это позволяют настройки безопасности брозера, HttpWebRequest не во всех случаях позволит обратиться к произвольному ресурсу), но надо вручную формировать запросы и парсить ответы. Все это было возможно и без асп.нет аякса, более того асп.нет аякс в этом муторном деле никак не помогает.
Вывод: асп.нет аякс не дает никаких преимуществ при работе с soap сервисами. Что касается “специальных сервисов аякс” — json сериализатор пишется за 1.5 часа и еще 3 часа отлаживается, таким на сборку “специального сервиса” на коленках уходит меньше времени, чем на изучение асп.нет аякса + WCF, даже если вы никогда раньше этого не делали.