Cum funcționează serviciile web

Astăzi, există două moduri fundamental diferite de a implementa servicii Web bazate pe HTTP în Microsoft® .NET. Prima tehnică și cea mai joasă tehnică este scrierea unei clase speciale IHttpHandler, care este inserată în conducta .NET HTTP. Această abordare necesită utilizarea API-ului System.Web pentru a gestiona mesajele primite HTTP și API System.Xml pentru procesarea plicului SOAP care se află în corpul HTTP. Când scrieți un handler special, trebuie, de asemenea, să creați manual un document WSDL care să descrie cu exactitate implementarea. Pentru a face toate acestea în mod corect, aveți nevoie de o înțelegere profundă a specificațiilor XML, XSD, SOAP și WSDL, care este o condiție minunată pentru majoritatea utilizatorilor.







O modalitate mai productivă de a implementa servicii Web este de a utiliza WebMethods-ul shell-ului Microsoft ASP.NET. Cu ASP.NET vine clasa speciala IHttpHandler pentru .asmx (numit WebServiceHandler), care oferă un set de caracteristici esențiale pe care XML funcțional, XSD, SOAP și WSDL. Și, din moment ce shell-ul WebMethods te protejează de complexitatea tehnologiilor XML, poți să te concentrezi rapid asupra problemelor logice de afaceri existente.


Figura 1. Raportul beneficiu-pierdere între flexibilitate și productivitate

Alegerea între tehnicile de realizare conduce la o comparație de ansamblu a câștigurilor și a pierderilor între flexibilitate și eficiență, așa cum se arată în figura 1. Creați un obicei IHttpHandler vă oferă flexibilitate nelimitată, dar, de asemenea, necesită mai mult timp pentru a scrie, testa și depana codul. Cochilia WebMethods facilitează organizarea serviciului dvs. web și viteza de dezvoltare, dar vă limitați clar la cadrul shell. Cu toate acestea, în cazul în care shell-ul WebMethods nu oferă exact ceea ce aveți nevoie, puteți să-l extindeți prin adăugarea de funcții suplimentare.

WebMethods împachetează conversiile mesajului SOAP în metodele .NET de clasă. Acest lucru se face, în primul rând, prin adnotarea metodelor dvs. cu atributul [WebMethod], aflat în spațiul de nume System.Web.Services. De exemplu, următoarea clasă .NET conține patru metode, dintre care două sunt adnotate cu atributul [WebMethod]:

Pentru a utiliza această clasă cu pachetul WebMethods, trebuie să îl compilați într-un ansamblu și să îl copiați în directorul virtual al directorului bin. În acest exemplu, Add și metodele scădeți pot fi dezvăluite ca operațiunile de servicii web, în ​​timp ce metodele și Multiply împarte acest lucru poate fi făcut (pentru că nu au fost marcate atribut [WebMethod]).

Deschideți Adăugați și scădeți ca operațiuni de serviciu Web printr-un fișier .asmx. Pentru a face acest lucru, creați un nou fișier text Math.asmx, care conține următoarea descriere simplă, și puneți-l în același director virtual care conține ansamblul (notă: fișierul este plasat în directorul virtual în sine, mai degrabă decât bin său director filială):

Aceasta este una dintre opțiunile principale pentru manipulatorul .asmx. Fișierul .asmx conține, de obicei, numai o descriere a serviciului WebService care face trimitere la clasa de servicii Web după nume (ca în exemplul prezentat mai jos). Prin urmare, în acest caz, ansamblul trebuie să fie deja compilat și plasat în directorul bin al directorului virtual. Instrumentul .asmx oferă, de asemenea, o compilație JIT a codului sursă găsit în fișierul .asmx. De exemplu, următorul fișier (numit Mathjit.asmx) conține o descriere a serviciului WebService împreună cu codul sursă al clasei de referință.

Când acest fișier este accesat prin HTTP pentru prima dată, manipulatorul .asmx compilează sursa și aranjează ansamblul corect. Rețineți că în descrierea WebService trebuie să fie specificat limbajul de programare astfel încât manipulatorul .asmx să poată alege compilatorul potrivit în timpul rulării. Dezavantajul evident al acestei abordări este că nu știți despre erorile de compilare până când nu ați accesat fișierul.


Figura 2. Documentația MathService

Când creați un nou serviciu Web service în Visual Studio® .NET, utilizați întotdeauna tehnica "două fișiere" atunci când fișierul de clasă sursă este separat de fișierul .asmx care îl referă. IDE ascunde în mod clar acest lucru de la dvs., dar dacă faceți clic pe Afișați toate fișierele din bara de instrumente Solution Explorer, veți vedea două fișiere pentru fiecare clasă de servicii Web din proiect. Apropo, Visual Studio .NET nu acceptă evidențierea sintaxelor sau IntelliSense® pentru fișierele .asmx, deci vă decideți să urmați în această direcție. În proiectele Web, Visual Studio .NET se ocupă și de crearea unui director virtual și de compilarea automată a ansamblului în directorul bin al directorului virtual.

Înainte de a scufunda în detaliile manipulatorului .asmx, să discutăm pe scurt cum sunt procesate mesajele de pe Internet Information Server (IIS), în primul rând în mânerul .asmx. Când mesajul HTTP primit ajunge la portul 80, pentru a determina ce DLL ISAPI ar trebui să fie utilizat pentru a procesa, IIS utilizează informațiile metabase IIS. Instalarea .NET leagă extensiile .asmx la Aspnet_isapi.dll, după cum se arată în Figura 3.


Figura 3. Legarea IIS și .asmx

Aspnet_isapi.dll este extensia standard ISAPI oferită de .NET Framework, care rutează pur și simplu cererile HTTP către un flux de lucru separat, numit Aspnet_wp.exe. Aspnet_wp.exe acționează ca gazdă pentru runtime-ul comun al limbii și pentru conducta .NET HTTP. Odată ce mesajul este inclus în conducta .NET HTTP, conductele arată în fișierul de configurare care ar trebui să fie folosit pentru această extensie. Dacă vă uitați la fișierul Machine.config, veți vedea că acesta conține httpHandler asociat cu extensia .asmx, după cum se arată aici:

Imediat după ce conducta .NET HTTP apelează procesorul .asmx, procesarea XML, XSD, SOAP și WSDL începe miraculos. Rămânând funcționalitatea furnizată handler .asmx, acestea pot fi împărțite în trei grupe principale: 1) pentru a coordona comunicații 2) transformarea XML în obiecte, și 3) Generarea și WSDL automată a documentelor. Să ne uităm la fiecare dintre aceste grupuri în detaliu.
Dispecerizarea mesajelor

Când conducta HTTP apelează handlerul .asmx, vizualizând descrierea WebService din fișierul .asmx, determină ce clasă .NET să folosească. Apoi se uită prin mesajul HTTP primit pentru a determina ce metodă să apeleze în această clasă. Pentru a apela operația Adăugată în exemplele anterioare, mesajul HTTP primit ar trebui să arate astfel:







De fapt, există două secțiuni în mesajul HTTP, care pot fi utilizate pentru a determina metoda care ar trebui să fie numit în clasă: antet SOAPAction sau numele elementului solicitat (adică numele elementului în interiorul elementului de săpun: Corp). În acest caz, cel puțin una dintre ele specifică numele metodei pe care expeditorul dorește să o apeleze.

Puteți schimba numele de serviciu spațiu Web, marcarea atributul de clasă al [WebService], precum și valoarea exactă a SOAPAction, marcarea WebMethods atribut [SoapDocumentMethod], după cum se arată mai jos:

Dacă .asmx handler nu găsește SOAPAction, potrivit pentru mesajul HTTP, el doar aruncă o excepție (mai târziu, ia în considerare modul în care sunt tratate excepții). Dacă metoda dispecherezatsii nu utilizați SOAPAction marcare clasa de proprietate atribut RoutingStyle [SoapDocumentService] antet, puteți specifica numele unui element de interogare utilizare handler .asmx. Dacă face acest lucru, de asemenea, trebuie să se precizeze că WebMethods nu necesită valoarea SOAPAction, prin stabilirea valorilor lor la șirul gol, după cum se arată mai jos:

Aceasta înseamnă că primul lucru pe care manipulatorul .asmx îl face atunci când este recepționat un mesaj HTTP primit - determină modul de redirecționare a mesajului la WebMethod corespunzător. Cu toate acestea, înainte de a putea suna de fapt metoda, trebuie să convertească obiectele XML primite în obiecte .NET.
Conversia XML în obiecte

Odată ce manipulatorul WebMehod a determinat ce metodă să apeleze, trebuie să deserializeze mesajul XML în obiectele .NET care pot fi furnizate în timpul apelului metodei. La fel ca atunci când trimiteți un mesaj, mecanicul verifică clasa utilizând reflecția pentru a afla cum să se ocupe de mesajul XML primit. Clasa XmlSerializer convertește automat între XML și obiecte din spațiul de nume System.Xml.Serialization.

XmlSerializer face posibilă transformarea oricărui tip de NET publice în XML Schema și tipul, cu toate acestea, se poate efectua conversia automată între obiecte și documente .NET XML (a se vedea. Figura 4). XmlSerializer este limitat la acele caracteristici care astăzi acceptă XML Schema, astfel încât acesta să nu funcționeze cu toate complexitatea modelelor de obiecte de astăzi, cum ar fi complexul nu este diagrame de arbori de obiecte, indicii duplicat, etc. În ciuda acestui fapt, XmlSerializer poate lucra cu majoritatea tipurilor complexe folosite de dezvoltatori.

Pentru exemplul de mai sus, Adăugați XmlSerializer convertește elementele x și y într-o valoare dublă .NET, care poate fi furnizată atunci când apelați Adăugați. Metoda Adăugare returnează o valoare dublă apelantului, care trebuie apoi să fie serializată din nou în elementul XML din răspunsul SOAP.


Figura 4. Convertirea XML în obiecte

De asemenea, XmlSerializer poate funcționa automat cu tipuri complexe (cu excepția restricțiilor descrise mai sus). De exemplu, următorul WebMethod calculează distanța dintre două structuri Point:

Mesajul de solicitare SOAP pentru această operațiune va conține un element de distanță care include doi copii, orig și dest și fiecare dintre aceste elemente trebuie să conțină elementele copilului x și y:

În acest caz, mesajul de răspuns SOAP va conține un element DistanceResponse care include un element DoubleResult de tip double:

Transformarea implicită a XML utilizează numele metodei ca numele elementului de interogare și numele parametrilor ca nume de element copil. Structura fiecărui parametru depinde de structura tipului. Numele câmpurilor și proprietăților publice sunt pur și simplu convertite în elemente copil, ca în cazul lui x și y (în Point). Numele elementului de răspuns implicit este numele elementului de interogare care se termină cu cuvântul "Răspuns". Elementul de răspuns conține, de asemenea, elementele copilului, denumite și elementele de interogare care se termină doar cu cuvântul "Rezultat".

Este posibil să vă eliberați de conversia standard în format XML utilizând un număr mare de atribute de conversie încorporate. De exemplu, pentru a converti un nume de tip și un spațiu de nume, puteți folosi atributul [XmlType]. Pentru a controla modul în care parametrii sau membrii unei clase convertesc elemente sau atribute, puteți utiliza atributele [XmlElement] și [XmlAttribute], respectiv. Și pentru a controla modul în care metoda în sine este convertită la numele elementelor din mesajele de solicitare / răspuns, puteți folosi atributul [SoapDocumentMethod]. De exemplu, citiți următoarea versiune a distanței, care utilizează atribute diferite:

În această versiune a Distanței este de așteptat ca mesajul de primire SOAP să arate astfel:

Și acest mesaj de răspuns SOAP va fi generat:

Pentru a implementa și defini conversia de mai sus, procedura implicită .asmx utilizează un stil SOAP document / literal. Aceasta înseamnă că descrierea WSDL va cuprinde alfabetice schemă XML definiție și Query descrie elementele și elementele de răspuns utilizate în mesajele SOAP (SOAP adică reguli de codare nu sunt utilizate).

Pe lângă deserializarea parametrilor, manipulatorul .asmx poate, de asemenea, să deserializeze / serializeze anteturile SOAP. Capacele SOAP sunt tratate diferit decât parametrii, deoarece acestea sunt de obicei considerate informații fără legătură fără o legătură directă cu o anumită metodă. Prin urmare, procesarea antetului se face, de obicei, folosind nivele de interceptare care protejează complet WebMethod-urile de necesitatea de a face față procesării antetului.

Dacă, la urma urmei, doriți să utilizați informații de antet de la WebMethod, trebuie să furnizați o clasă .NET care este moștenită de la SoapHeader, care reprezintă anteturile XML Schema (conform liniilor directoare de conversie date mai sus). Apoi definiți o variabilă de membru de acest tip care acționează ca un "substituent" pentru instanțele antetului. În cele din urmă, etichetați fiecare WebMethod care are nevoie de acces la antet, specificând numele câmpului în care doriți să fie trimis.

De exemplu, o solicitare SOAP care conține antetul UserToken în scopul autentificării:

Pentru a face posibil pentru .asmx deserializarea antet manipulant, trebuie mai întâi pentru a determina clasa .NET care reprezintă tipul dorit de XML Schema (Notă: dacă aveți de fapt o schemă XML pentru antet, puteți genera o clasă folosind xsd.exe / c) . În acest caz, clasa corespunzătoare arată astfel:

Apoi, trebuie doar să definiți variabila membru din clasa WebMethod pentru a stoca instanța clasei antet. și adnotați WebMethods cu atributul [SoapHeader], după cum se arată mai jos:

Instrumentul .asmx oferă, de asemenea, serializarea automată a excepției .NET. Orice excepție nefolosită, capturată de manipulatorul .asmx, este serializată automat la elementul SOAP Fault din răspuns. De exemplu, în exemplul anterior, dacă numele de utilizator nu se potrivește cu parola, codul nostru generează o excepție .NET. Apoi manipulatorul .asmx îl va procesa și îl va serializa într-un răspuns SOAP, după cum se arată mai jos:

Clienții trebuie să știe exact ce ar trebui să arate un mesaj SOAP pentru a funcționa cu succes cu acesta. Este general acceptat să furnizeze descrieri de servicii web prin WSDL (și definiții XSD încorporate). Pentru a face acest lucru, instrumentul .asmx generează automat atât o pagină de documentație, cât și o descriere WSDL care reflectă cu precizie interfața WebMethod. Dacă ați aplicat un grup de atribute de conversie în WebMethods, toate acestea vor fi reflectate în documentația generată.

Dacă te uiți fișierul .asmx, veți găsi o pagină de documentare, cum ar fi prezentat în Figura 2. Această pagină manual este generată pagina aspx, numit DefaultWsdlHelpGenerator.aspx (situat în C: windowsMicrosoft.NETFramework v1.0.3705config). Dacă deschideți fișierul, veți vedea că aceasta este doar o pagină standard ASP.NET care utilizează reflecția .NET pentru a genera documentație. Această caracteristică permite ca documentația să corespundă întotdeauna codului. Pur și simplu modificând acest fișier, puteți modifica documentația generată.

De asemenea, puteți bloca generarea de documentație bazată pe directorul virtual, prin definirea unui alt fișier de documentare în fișierul Web.config:

Dacă un client completează o solicitare GET pentru simbolurile .asmx „? WSDL“, în șirul de interogare, în loc de handler .asmx generează descrierea WSDL a documentației. Clienții pot utiliza descrierea WSDL pentru a genera clase proxy, care vor ști în mod automat modul de a comunica cu serviciul web (de exemplu, folosind Wsdl.exe în .NET).

Folosind două tehnici diferite, puteți bloca complet procesul de generare a WSDL. În primul rând, accesul clienților, vă poate oferi un document WSDL static în directorul virtual, și apoi blocați generatorul de documentare, scoate-l din fișierul web.config, după cum se arată mai jos:

Carcasa WebMethods ASP.NET oferă o abordare de înaltă performanță pentru construirea serviciilor Web. WebMethods a făcut posibilă utilizarea metodelor tradiționale .NET ca operațiuni de servicii Web care acceptă HTTP, XML, XML Schema, SOAP și WSDL. Manipulatorul WebMethod (.asmx) determină automat modul de trimitere a mesajelor SOAP primite la metoda corespunzătoare, moment în care se serializează automat elementele XML primite către obiectele .NET corespunzătoare. Și simplificarea vieții clientului, manipulatorul .asmx furnizează de asemenea suport automat pentru generarea de documentație pentru om (HTML) și pentru mașină (WSDL).

rating: +2 din 2 5







Articole similare

Trimiteți-le prietenilor: