. Należy pamiętać, że wynik o wartości
-1 oznacza, że w sesji nie został zarejestrowany znacznik czasu i w związku z tym nie można
obliczyć różnicy czasowej.
function showDifference(result) {
if (result != -1) {
document.getElementById("output").innerHTML =
"Formularz był wyświetlany przez " + result + " sekund";
}
}
Kompletny kod strony (treść HTML i skrypt niezbędny do zaimplementowania algorytmu)
został przedstawiony w przykładzie 5.4. Wszystkie zmiany w treści zostały odpowiednio
wyróżnione. Aby aplikacja działała poprawnie, trzeba pamiętać o dodaniu atrybutu Enable-
PageMethods="true" do kodu kontrolki ScriptManager. Brak atrybutu uniemożliwia wy-
wołanie metody strony.
Przykład 5.4. Wykorzystanie sesji w aplikacji ASP.NET AJAX i 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 Podczas wykonywania metody DivideNumbers() można zauważyć nieco inne działanie
przeglądarki niż w poprzednich zadaniach. Po pierwsze, serwer dostarcza plik cookie zwią-
zany z sesją (o ile w pliku Web.config nie została włączona opcja zarządzania sesją bez użycia
plików cookie). Jeżeli w przeglądarce została włączona opcja pytania o zezwolenie na przyję-
cie pliku cookie, na ekranie powinno się wyświetlić okno, zbliżone do przedstawionego na
rysunku 5.3. Druga różnica wiąże się z zachowaniem danych sesji pomiędzy odwołaniami do
usługi sieciowej (rysunek 5.4).
Rysunek 5.3. Środowisko ASP.NET przesyła plik cookie związany z sesją dla danej strony
114 | Rozdział 5. Usługi sieciowe
Rysunek 5.4. Wykorzystanie sesji do przechowywania wartości czasu (niezbędnej do obliczenia przerwy
między pobraniem strony i wykonaniem działania)
Wymiana złożonych struktur danych
między klientem i serwerem
We wcześniejszych przykładach analizowaliśmy jedynie wymianę między serwerem i klientem
ciągów tekstowych i wartości typów prostych (liczb, wartości logicznych). Nic jednak nie stoi
na przeszkodzie, aby objąć tym mechanizmem również operację dostarczania bardziej złożo-
nych struktur danych. Co prawda język JavaScript nie może konkurować z bogatszymi pod
względem liczby typów językami platformy .NET, ale format JSON (opisany w rozdziale 3.)
zapewnia podstawową obsługę tablic i obiektów.
Środowisko ASP.NET AJAX jest standardowo wyposażone w mechanizmy serializacji i dese-
rializacji danych JSON. Jeśli więc uwzględnimy je w kodzie usługi sieciowej zaprezentowanej
w przykładach 5.1 i 5.2, będziemy mogli udostępnić nową metodę, która za jednym razem
zwróci dwie informacje wynik dzielenia liczb oraz wartość znacznika czasu serwerowego.
Aby wdrożyć opisane rozwiązanie, utworzymy w pliku MathService.asmx nową klasę, która
będzie opisywała zwracany obiekt.
public class DivisionData
{
public float result;
public string calculationTime;
}
Powołanie i zwrócenie obiektu będzie należało do metody przedstawionej poniżej.
[WebMethod]
public DivisionData ExtendedDivideNumbers(int a, int b) {
if (b == 0) {
throw new DivideByZeroException( );
} else {
float res = (float)a / b;
string stamp = DateTime.Now.ToLongTimeString( );
DivisionData d = new DivisionData( );
d.result = res;
Wymiana złożonych struktur danych między klientem i serwerem | 115
d.calculationTime = stamp;
return d;
}
}
Aby zwracany obiekt był dostępny dla kodu JavaScript, aplikacja ASP.NET AJAX musi
go przekształcić (w procesie serializacji) w odpowiedni ciąg JSON. Za użycie właściwej
definicji obiektu odpowiada atrybut GenerateScriptType (zdefiniowany w przestrzeni
nazw System.Web.Script.Services [w której zostały zapisane również atrybuty Script-
Service i ScriptMethod]):
[System.Web.Script.Services.GenerateScriptType(typeof(DivisionData))]
Po stronie serwera nie trzeba wprowadzać więcej zmian. Zaktualizowana treść pliku Math-
Service.asmx została zamieszczona w przykładzie 5.5.
Przykład 5.5. Zaktualizowany plik usługi MathService
MathService.asmx
<%@ WebService Language="C#" Class="MathService" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
public class DivisionData
{
public float result;
public string calculationTime;
}
[WebService(Namespace = "http://hauser-wenz.de/AspNetAJAX/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
[System.Web.Script.Services.GenerateScriptType(typeof(DivisionData))]
public class MathService : System.Web.Services.WebService
{
[WebMethod]
public float DivideNumbers(int a, int b)
{
if (b == 0)
{
throw new DivideByZeroException();
}
else
{
return (float)a / b;
}
}
[WebMethod]
public DivisionData ExtendedDivideNumbers(int a, int b)
{
if (b == 0)
{
throw new DivideByZeroException();
}
else
116 | Rozdział 5. Usługi sieciowe
{
float res = (float)a / b;
string stamp = DateTime.Now.ToLongTimeString();
DivisionData d = new DivisionData();
d.result = res;
d.calculationTime = stamp;
return d;
}
}
}
Po stronie klienta deserializacja obiektu DivisionData jest realizowana w sposób automa-
tyczny. Obiekt będący wynikiem wywołania usługi sieciowej ma te same właściwości (result
i calculationTime), jakie zostały zdefiniowane w obiekcie DivisionData. Instrukcje Java-
Script potrzebne do wywołania zmodyfikowanej usługi sieciowej zostały przedstawione
w przykładzie 5.6.
Przykład 5.6. Kod strony pobierającej z metody sieciowej bardziej rozbudowane obiekty
Complex.aspx
<%@ Page Language="C#" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
ASP.NET AJAX Wymiana złożonych struktur danych między klientem i serwerem | 117
Sposób prezentacji wyniku dzielenia i czasu wygenerowania odpowiedzi został pokazany na
rysunku 5.5.
Rysunek 5.5. Wyświetlenie informacji dostarczonych przez serwer
Przechwytując ruch HTTP generowany przez skrypt, możemy sprawdzić, w jaki sposób zło-
żona struktura danych została przekształcona w blok danych JSON (rysunek 5.6).
Opisane do tej pory funkcje środowiska ASP.NET AJAX związane z usługami sieciowymi
byłby niezwykle trudne do zaimplementowania za pomocą samego języka JavaScript. Plat-
forma ASP.NET AJAX doskonale integruje się z usługami sieciowymi .NET i stanowi bardzo
użyteczny pomost między technologią JavaScript (po stronie klienckiej) i technologią ASP.NET
(po stronie serwera).
118 | Rozdział 5. Usługi sieciowe
Rysunek 5.6. Złożona struktura danych po serializacji do formatu JSON
Wykorzystanie usług sieciowych
z poziomu skryptu JavaScript
Zapewniane przez środowisko ASP.NET AJAX mechanizmy odwołań do usług sieciowych są
niezwykle użyteczne, ponieważ automatycznie realizują wszystkie związane z tą operacją
zadania. Zdarzają się jednak sytuacje, w których nie można ich zastosować. Przykładem może
być konieczność odwołania się do usługi sieciowej (w tej samej domenie), która nie została
napisana dla platformy .NET, lecz opiera się na innych rozwiązaniach serwerowych, takich
jak PHP lub Java. Innym powodem bywa również polityka firmy dotycząca stosowania mo-
dułów zewnętrznych producentów lub brak akceptacji dla określonej umowy licencyjnej.
Ponieważ zakres tematyczny książki wykracza poza samo korzystanie ze środowiska
ASP.NET AJAX i obejmuje wszystkie zagadnienia związane z tworzeniem aplikacji Ajax na
platformie ASP.NET, omówione zostaną tutaj także zasady wywoływania zdalnych usług
sieciowych z poziomu skryptu JavaScript.
Zanim przystąpimy do szczegółowego analizowania stosownych mechanizmów, warto sobie
przypomnieć, że model zabezpieczeń języka JavaScript zabrania wykonywania skryptów po-
chodzących z różnych domen. Oznacza to, że nie można odwołać się do zdalnych witryn za
pomocą instrukcji JavaScript (korzystających z obiektu XMLHttpRequest).
Wykorzystanie usług sieciowych z poziomu skryptu JavaScript | 119
Istnieją dwie metody programowego wywoływania usług sieciowych w języku JavaScript.
Pierwsza z nich polega na zastosowaniu obiektu XMLHttpRequest. Natomiast w drugiej za-
kłada się przygotowanie własnego żądania HTTP SOAP i samodzielną interpretację danych
zwracanych przez serwer. Druga metoda jest dość skomplikowana i bardzo podatna na błędy.
Znacznie lepszym rozwiązaniem jest wykorzystanie mechanizmów wbudowanych w prze-
glądarką oraz oficjalnych dodatków do przeglądarki,
Niestety, dwie najpowszechniej stosowane aplikacje Internet Explorer i Mozilla (czyli Firefox,
Epiphany, Camino itd.) mają zaimplementowane dwie zupełnie różne procedury wywo-
ływania usług sieciowych. W rezultacie programista musi powielać kod zapewniający obsługę
każdej z przeglądarek. W końcowej części podrozdziału zostało jednak przedstawione roz-
wiązanie, które pozwala na połączenie obydwu modeli, a tym samym na opracowanie skryptu
(bardziej lub mniej) niezależnego od rodzaju oprogramowania klienckiego.
Usługi sieciowe w przeglądarkach Internet Explorer
Kilka lat temu firma Microsoft rozpoczęła prace na kodem skryptowym, który umożliwiałby
wywoływanie usług sieciowych z poziomu samej przeglądarki. Zgodnie z założeniami kod
taki powinien powoływać obiekt XMLHttpRequest, definiować niezbędne nagłówki HTTP dla
żądania SOAP, przygotowywać treść samego żądania, następnie oczekiwać na odpowiedz
SOAP i przekształcać wynik do formatu właściwego do dalszego przetwarzania w instruk-
cjach JavaScript. Ponadto powinien umożliwiać interpretowanie informacji generowanych
w języku opisu usług sieciowych (WSDL ang. Web Service Description Language) oraz gene-
rowanie lokalnego obiektu pośredniczącego.
Idea nie jest skomplikowana, ale implementacja tak. Ostateczna wersja mechanizmu (wersja
1.0.1.1120) składa się z niemal 2300 wierszy kodu. Niestety, w 2002 roku firma Microsoft
przerwała prace nad komponentem komunikacji z usługami sieciowymi. Szkoda, gdyż do
dzisiaj jest on wykorzystywany i działa poprawnie. Na szczęście jest jeszcze dostępny w ar-
chiwach MSDN pod adresem http://msdn.microsoft.com/archive/en-us/samples/internet/behaviors/
library/webservice/default.asp.
Aby z niego skorzystać, trzeba pobrać plik webservice.htc i zapisać w katalogu, w którym prze-
chowywane są skrypty przykładów. Rozszerzenie .htc oznacza kontrolkę HTML (HTML control),
zwaną też funkcją (ang. behavior) przeglądarki Internet Explorer. Do załadowania pliku służy
niestandardowa instrukcja stylu CSS, obsługiwana jedynie w aplikacjach Internet Explorer.
Nazwa podana jako wartość atrybutu id może być wykorzystana w skrypcie w JavaScript
zarówno do odwołania do samej kontrolki HTML, jak i do odwołania do usługi sieciowej
z nią związanej.
Powiązanie kontrolki z usługą wymaga zdefiniowania odsyłacza do opisu WSDL danej usługi
sieciowej. Wykorzystuje się do tego celu metodę useService() zapisaną w pliku .htc. Konieczne
jest również określenie niepowtarzalnego identyfikatora, który umożliwi pózniejsze odwoły-
wanie się do danej usługi sieciowej.
WebService.useService("MathService.asmx?WSDL", "MathService");
120 | Rozdział 5. Usługi sieciowe
Po tych operacjach można wywołać usługę. Kolejność parametrów przekazywanych do me-
tody callService() odpowiadającej za wywołanie usługi sieciowej różni się od stoso-
wanej w obiektach pośredniczących ASP.NET AJAX. Oto lista tych parametrów:
" referencja do metody zwrotnej,
" nazwa wywoływanej metody sieciowej,
" parametry przekazywane do usługi sieciowej.
Rozwiązanie to nie zapewnia obsługi błędów (w przeciwieństwie do mechanizmów ASP.NET
AJAX, które dostarczają wyjątki do skryptu klienckiego).
W przypadku odwołania do usługi MathService podzielenie dwóch liczb wymagałoby wy-
konania następującej instrukcji:
WebService.MathService.callService(
callComplete,
"DivideNumbers",
6, 7);
Funkcja zwrotna otrzymuje wówczas obiekt, którego atrybut value zawiera wynik zwrócony
przez usługę sieciową.
function callComplete(result) {
document.getElementsById("c").innerHTML = result.value;
}
Pełny kod aplikacji został zamieszczony w przykładzie 5.7.
Przykład 5.7. Wywołanie usługi sieciowej w przeglądarce Internet Explorer
MathServiceInternetExplorer.htm
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
ASP.NET AJAX
Jeśli kontrolka HTML usługi sieciowej nie zostanie zdefiniowana na początku sekcji
, przeglądarka może wygenerować niepokojące komunikaty o błędach,
włącznie z informacją o tym, że obiekt WebService nie został zdefiniowany (mimo
prawidłowego działania instrukcji window.alert(WebService)).
Usługi sieciowe w przeglądarkach Mozilla
Obsługa usług sieciowych została zaimplementowana również w wydawanych ostatnio wer-
sjach przeglądarek Mozilla. Ma ona charakter wbudowanego rozszerzenia. Niestety, kompo-
nent odpowiedzialny za komunikację z usługami sieciowymi najwyrazniej nie zyskał szcze-
gólnego zainteresowania u osób skupionych wokół projektu Mozilla, choć trzeba przyznać, że
poprawnie wykonuje swoje zadanie. W rezultacie nie towarzyszy mu żadna dokumentacja,
a informacje na temat jego użycia są często sprzeczne. Rozwiązanie prezentowane w dalszej
części punktu pozwala na realizację zadnia, ale wymaga dodania sporej ilości kodu.
Za komunikację z usługami sieciowymi odpowiada klasa SOAPCall. Ponieważ opiera się ona
na standardzie SOAP 1.1, programista musi zdefiniować nagłówek SOAPAction (dostępny
w formie właściwości klasy SOAPClass) oraz adres URL pliku usługi sieciowej. Oto instrukcje
charakterystyczne dla omawianego przykładu:
var soapcall = new SOAPCall( );
soapcall.actionURI = "http://hauser-wenz.de/AspNetAJAX/DivideNumbers";
soapcall.transportURI =
"http://localhost:1234/AJAXEnabledWebSite1/MathServiceDocEnc.asmx";
Wartość właściwości transportURI musi bezwzględnie odpowiadać adresowi URL.
Trzeba więc pamiętać o dostosowaniu ciągu URI (szczególnie numeru portu, jeśli do
uruchamiania aplikacji jest wykorzystywany serwer testowy środowiska Visual Studio
lub Visual Web Developer) do ustawień lokalnego systemu.
Wszystkie parametry przekazywane do usługi są zmiennymi typu SOAPParameter. W kon-
struktorze klasy parametru należy wskazać wartość parametru, a następnie jego nazwę.
var p1 = new SOAPParameter(6, "a");
var p2 = new SOAPParameter(7, "b");
Bardzo ważne jest wykonanie następnej czynności. Jej ewentualne pominięcie spowoduje, że
żądanie SOAP zostanie przesłane do serwera (odebrana zostanie również wartość wyniku),
ale nie będą do niego dołączone parametry. W przypadku dzielenia liczb oznaczałoby to nie-
zamierzone wygenerowanie wyjątku dzielenia przez zero (ang. divie by zero).
122 | Rozdział 5. Usługi sieciowe
Zadanie polega na osobistym ustaleniu właściwego kodowania dla wartości liczbowych.
W tym celu należy załadować odpowiednią przestrzeń nazw, która obejmuje typ SOAP
integer. Następnie trzeba określić wartość właściwości schemaType wszystkich parametrów,
które powinny być przekazane do usługi sieciowej, przypisując im wygenerowane typy danych.
Kod realizujący opisane zadania został zamieszczony poniżej.
var senc = new SOAPEncoding( );
assenc = senc.getAssociatedEncoding(
"http://schemas.xmlsoap.org/soap/encoding/",
false);
var scoll = assenc.schemaCollection;
var stype = scoll.getType(
"integer",
"http://www.w3.org/2001/XMLSchema");
p1.schemaType = stype;
p2.schemaType = stype;
Kolejna czynność polega na przygotowaniu wywołania usługi sieciowej. Służy do tego
metoda encode(), wymagająca przekazania do niej kilku parametrów, zgodnie z poniższym
przykładem.
soapcall.encode(
0, //wartość domyślna dla protokołu SOAP 1.1
"DivideNumbers", //nazwa metody sieciowej
"http://hauser-wenz.de/AspNetAJAX/", //przestrzeń nazw
0, //liczba dodatkowych nagłówków
new Array( ), //dodatkowe nagłówki
2, //liczba parametrów
new Array(p1, p2) //parametry
);
W końcu można wywołać usługę sieciową (w sposób asynchroniczny), wykonując metodę
asyncInvoke(). Parametrem metody jest referencja funkcji zwrotnej.
soapcall.asyncInvoke(callComplete);
Funkcja zwrotna otrzymuje trzy parametry:
" dokument XML będący wynikiem wywołania usługi sieciowej,
" obiekt SOAPCall (gdyby konieczne było przeanalizowanie nagłówków SOAP),
" kod statusowy HTTP dla wywołania.
Ostatni etap procedury sprowadza się do wyodrębnienia danych wynikowych z treści do-
starczonego dokumentu XML. Przyjrzyjmy się zatem odpowiedzi XML zwracanej po odwo-
łaniu się do usługi MathService dane te można pozyskać za pomocą programu Fiddler
(dla systemu Windows) (http://www.fiddlertool.com/fiddler) lub rozszerzenia przeglądarki
Mozilla Live HTTP Headers (http://livehttpheaders.mozdev.org/):
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap
.org/soap/envelope/">
0.857142866
Wykorzystanie usług sieciowych z poziomu skryptu JavaScript | 123
Więcej informacji na temat sposobu analizowania żądań HTTP (wysyłanych przez
aplikacje Ajax) oraz debugowania aplikacji Ajax znajduje się w dodatku A.
Analizując dane w formacie XML, nietrudno zauważyć, że wyodrębnienie wartości 0.857142866
wymaga przeprowadzenia następujących operacji:
" odwołania się do właściwości body, która zapewni dostęp do elementu
;
" odwołania się do właściwości firstChild, która zapewni dostęp do elementu NumbersResponse>;
" ponownego wykorzystania właściwości firstChild do pobrania elementu bersResult>;
" wykorzystania po raz trzeci właściwości firstChild, aby uzyskać dostęp do węzła tek-
stowego w elemencie ;
" wykorzystania właściwości data do pobrania ciągu zapisanego w węzle tekstowym.
Treść skryptu JavaScript niezbędnego do wyodrębnienia wyniku z dokumentu dostarczonego
przez usługę sieciową została zamieszczona poniżej.
function callComplete(result, soapcall, status) {
document.getElementById("c").innerHTML =
result.body.firstChild.firstChild.firstChild.data;
}
Aącząc wszystkie opisane fragmenty skryptów, uzyskujemy kod przedstawiony w przykła-
dzie 5.8. Trzeba jednak pamiętać, że aplikacja będzie działała zgodnie z oczekiwaniami tylko
wtedy, gdy system będzie miał dostęp do internetu przeglądarki Mozilla muszą mieć do-
stęp do informacji na temat schematów SOAP.
Przykład 5.8. Wywołanie usługi sieciowej w przeglądarce Mozilla
MathServiceMozilla.htm
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
ASP.NET AJAX
Usługi sieciowe w obydwu przeglądarkach
Przegląd technik korzystania z usług sieciowych z poziomu skryptu JavaScript w przeglą-
darkach Internet Explorer i Mozilla zakończymy rozwiązaniem, które łączy obydwie metody
na jednej stronie. W tym celu musimy przede wszystkim ustalić, w jaki sposób rozpoznawa-
ny będzie rodzaj przeglądarki. Zgodnie z informacjami zamieszczonymi w rozdziale 2, naj-
korzystniejsze wydaje się sprawdzenie zestawu funkcji przeglądarki, a nie ich typu. Zasada
ta została wykorzystana podczas opracowywania kodu z przykładu 5.9 (jej opis znajduje się
w rozdziale 2, w części dotyczącej powoływania obiektu XMLHttpRequest). Rozwiązanie po-
lega na utworzeniu obiektu właściwego dla jednej przeglądarki. Jeśli to się uda, dalsza część
kodu zostanie wykonana zgodnie z założeniami. W przeciwnym przypadku wykorzystane
zostaną instrukcje właściwe dla drugiej przeglądarki. Poszczególne wywołania zostały za-
pisane w dwóch zagnieżdżonych konstrukcjach try & catch.
Wykorzystanie usług sieciowych z poziomu skryptu JavaScript | 125
Dostęp do zdalnych usług sieciowych
w przeglądarkach Mozilla
Model zabezpieczeń przeglądarki Mozilla umożliwia odwołania do zdalnych usług sieciowych.
Wykonanie skryptu wiąże się jednak z wyświetleniem okna dialogowego, w którym użyt-
kownik musi zezwolić na taką operację (rysunek 5.7). Wymagane jest w tym przypadku
uprawnienie UniversalBrowserRead, oznaczające, że przeglądarka może pobierać dane
z dowolnego serwera (włączając w to zarówno serwery zdalne, jak i lokalny system plików).
netscape.security.PrivilegeManager.enablePrivilege(
"UniversalBrowserRead");
Rysunek 5.7. Żądanie zwiększenia poziomu uprawnień w przeglądarce Firefox
Domyślna konfiguracja przeglądarek Mozilla i Firefox (a także kilku innych) powoduje na-
danie wspomnianego uprawnienia tylko w dostępie do plików lokalnych (z definicją protokołu
file://). Mechanizm ten znajduje więc zastosowanie głównie w aplikacjach intranetowych.
Wygląd okna dialogowego z żądaniem zwiększenia poziomu uprawnień został pokazany na
rysunku 5.7.
Przykład 5.9. Wywołanie usługi sieciowej w dowolnej z przeglądarek Internet Explorer i Mozilla
MathService.htm
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
ASP.NET AJAX
Wykorzystanie usług sieciowych z poziomu skryptu JavaScript | 127
W przykładzie 5.9 zostały zamieszczone wszystkie znaczniki i instrukcje skryptowe, które
pozwalają na wykonanie zadania. Nie zmienia to faktu, że przed wdrożeniem aplikacji trzeba
ją przetestować również w innych przeglądarkach. Należy również pamiętać o przypisaniu
właściwości soapcall.transportURI poprawnego adresu URL witryny (włącznie z numerem
portu, jeśli jest to konieczne).
Jak można się przekonać, analizując rysunki 5.8 i 5.9, opracowana aplikacja działa poprawnie
w dwóch najpowszechniej stosowanych przeglądarkach.
Rysunek 5.8. Wykonanie skryptu w przeglądarce Internet Explorer
Rysunek 5.9. Wykonanie skryptu w przeglądarkach Mozilla, a dokładniej w przeglądarce Firefox
128 | Rozdział 5. Usługi sieciowe
Pozostaje jeszcze tylko problem ustalenia, czy uzyskany efekt jest wart dodatkowej pracy.
Czy rzeczywiście przygotowanie niezbyt uniwersalnego rozwiązania do wywoływania usług
sieciowych można określić jako użyteczne? Witryny bazujące na platformie ASP.NET reali-
zują takie zadania bezproblemowo z wykorzystaniem kodu ASP.NET AJAX. Biorąc pod uwagę
łatwość wdrażania aplikacji ASP.NET AJAX, metoda opisana w tym punkcie powinna być
postrzegana jako ostatnia deska ratunku (szczególnie jeśli uwzględnimy wstrzymanie prac
nad rozwojem usług sieciowych w oprogramowaniu Mozilla).
Podsumowanie
W niniejszym rozdziale zostało opisanych kilka sposobów wykorzystania usług sieciowych.
W pierwszym podrozdziale zostały omówione zagadnienia związane z obsługą błędów i prze-
chowywaniem danych w sesji. Kolejne punkty zawierają przykłady wymiany złożonych da-
nych między aplikacjami klienckimi i usługami sieciowymi, a także przykłady rozwiązań
umożliwiających wywoływanie z poziomu skryptu JavaScript usług sieciowych udostępnio-
nych na serwerach innych niż ASP.NET.
Do dalszego czytania
http://msdn.microsoft.com/archive/en-us/samples/internet/behaviors/library/webservice/default.asp
Wcześniejsze wersje kontrolki webservice.htc.
http://ajax.asp.net/docs/tutorials/ASPNETAJAXWebServicesTutorials.aspx
Przewodnik dotyczący usług sieciowych w dokumentacji Microsoft ASP.NET AJAX.
Do dalszego czytania | 129
Wyszukiwarka
Podobne podstrony:
Czeka nas najbardziej drastyczny program oszczędnościowy od 20 lat
programowanie struk i obiekt 20 02 2011
ASPNET 20 i Ajax Wprowadzenie
2007 01 Web Building the Aptana Free Developer Environment for Ajax
Technologie ASPNET i ADONET w Visual Web Developer
ASPNET 20 Gotowe rozwiazania
Tubb, Ec @ Dumarest 20 @ Web Of Sand
00 Program nauki Monter sieci telekomunikacyjnych 725 02id 20
ASPNET 35 dla programistow PHP
2016 05 20 Ustawa Program modernizacji Policji 2017 2020 projekt
Ajax Zaawansowane programowanie
C Builder 20 efektownych programow
ASPNET w Visual Web Developer 2008 cwiczenia
więcej podobnych podstron