Transcript Document
.NET web
szolgáltatások
XSD
WSDL
SOAP
Web szolgáltatás készítés, fogyasztás
Bilicki Vilmos
[email protected]
www.inf.u-szeged.hu/~bilickiv
1
Az előző előadás tartalma
XSLT programozás
Nevesített sablonok
Váltózó, paraméterek
Ciklusok, feltételek
XSLT hivatkozások
Több XML dokumentum használata egy
stíluslapban
Kereszthivatkozások
Kereszthivatkozások az eredmény
dokumentumban
2
XML Schema Definition
Language
XML elemkészletet és nyelvtant definiál
XML szintaxist használ (SAX,DOM)
A legtöbb programnyelvben használt
adattípusokat használhatjuk
A névterek használata lehetővé teszi több
séma egybeolvasztását
3
XSD
Típusokat definiálhatunk
Beépített típusokat használhatunk (http://www.w3.org/TR/xmlschema-2/)
Szűkítéses származtatás
Az érték határok mellett a lexikális formátum is definiált
(0,1-true,false) -> kompatibilitás
4
Értékek, Lexikális típusok
5
Beépített adattípusokat használhatunk
Típusok definiálása névtéren
belül
A felhasználók definiálhatnak típusokat(UDT)
Típus definiáláskor hasonlóan az OO
nyelvekhez célszerű névtereket használni
6
Példa
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.org/publishing"
xmlns:tns="http://example.org/publishing">
<!-- type definitions -->
<xsd:simpleType name="AuthorId">
<!-- define value space details here -->
</xsd:simpleType>
<xsd:complexType name="AuthorType">
<!-- define structural details here -->
</xsd:complexType>
<!-- global element/attribute declarations -->
<xsd:element name="author" type="tns:AuthorType"/>
<xsd:attribute name="authorId" type="tns:AuthorId"/>
...
</xsd:schema>
7
XSD Alapelemek
8
Egyszerű típus:
xsd:simpleType
csak szöveges elemek értéke és attribútuma lehet
Összetett típus:
xsd:complexType
struktúrát definiál
Elem definiálása:
xsd:element
Attribútum definiálása:
xsd:attribute
Egyszerű típus konstrukció:
xsd:restriction
xsd:union
xsd:list
Használatuk XML-ben
<x:author xmlns:x="http://example.org/publishing">
<!-- structure determined by complexType definition -->
...
</x:author>
Vagy
<genericId
xmlns:x="http://example.org/publishing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="tns:AuthorId"
>333-33-3333</genericId>
9
Szűkítési minták
10
xsd:enumeration (lista)
xsd:fractionDigits (a tizedesjegy után)
xsd:length ()
xsd:maxExclusive
xsd:maxInclusive
xsd:maxLength
xsd:minExclusive
xsd:minInclusive
xsd:minLength
xsd:pattern
xsd:totalDigits
xsd:whiteSpace
Példa: Egyszerű típusok
...
<xsd:simpleType name="RoyaltyRate">
<xsd:restriction base="xsd:double">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="Pubs2003">
<xsd:restriction base="xsd:date">
<xsd:minInclusive value="2003-01-01"/>
<xsd:maxInclusive value="2003-12-31"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="rate" type="tns:RoyaltyRate"/>
<xsd:element name="publicationDate" type="tns:Pubs2003"/>
...
11
Példa: Lexikális szűkítés
...
<xsd:simpleType name="SSN">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-\d{2}-\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="PublisherAssignedId">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{2}-\d{8}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="Phone">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\(\d{3}\)\d{3}-\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="authorId" type="tns:SSN"/>
<xsd:element name="pubsAuId" type="tns:PublisherAssignedId"/>
<xsd:element name="phone" type="tns:Phone"/>
12...
Példa: felsorolás
...
<xsd:simpleType name="PublicationType">
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="Book"/>
<xsd:enumeration value="Magazine"/>
<xsd:enumeration value="Journal"/>
<xsd:enumeration value="Online"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="pubType" type="tns:PublicationType"/>
...
13
Példa: unió
...
<xsd:simpleType name="AuthorId">
<xsd:union memberTypes="tns:SSN
tns:PublisherAssignedId"/>
</xsd:simpleType>
<xsd:element name="authorId"
type="tns:AuthorId"/>
...
14
Komplex típusok
xsd:complexType:
névtér definiálás:
15
xsd:sequence
xsd:choice
xsd:all
ref
##any
##other
##targetNamespace
##local
Lista
<xsd:complexType name="AddressType">
<xsd:all>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string" minOccurs="0"/>
<xsd:element name="state" type="tns:State" minOccurs="0"/>
<xsd:element name="zip" type="tns:Zip"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="PublicationsListType">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="book" type="xsd:string"/>
<xsd:element name="article" type="xsd:string"/>
<xsd:element name="whitepaper" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
<xsd:complexType name="AuthorType">
<xsd:sequence>
<xsd:choice>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="fullName" type="xsd:string"/>
</xsd:choice>
<xsd:element name="address" type="tns:AddressType"/>
<xsd:element name="phone" type="tns:Phone" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="recentPublications„ type="tns:PublicationsListType"/>
</xsd:sequence>
<xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>
16
Objektumok mentése XMLként
A publikus adattagokat autómatikusan elmenti
Ezen tudunk változtatni Attribútumok
segítségével
public class TaxRates{
[XmlElement(ElementName = "TaxRate")]
public decimal ReturnTaxRate;
}
System.Xml.Serialization
XmlRootAttribute
XmlElementAttribute
XmlAttributeAttribute
XmlArrayAttribute
XmlArrayItemAttribute
17
Példa
•
•
•
•
•
•
•
•
•
•
•
•
•
•
18
[XmlRoot("account")]
public class Acct
{
[XmlElement("description")] public string Description;
[XmlElement("number")] public string Number;
[XmlElement("type")] public string Type;
[XmlElement("balance")] public decimal Balance;
[XmlAttribute("status")] public string Status;
}
...
[return:XmlArray("AccountList")]
[return:XmlArrayItem("Account")]
public Acct[] GetAllAccounts()
...
SOAP MEP
Message Exchanging Patterns:
Request – Response
Message
Peer-to-Peer
…
19
SOAP elemek
Envelope
Header (mustUnderstand)
Body
• Fault
•
•
•
•
VersionMismatch
MustUnderstand
Client
Server
SOAP kódolások:
20
RPC
Dokumentum
Példa
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Insufficient funds</faultstring>
<detail>
<x:TransferError xmlns:x="urn:examples-org:banking">
<sourceAccount>22-342439</sourceAccount>
<transferAmount>100.00</transferAmount>
<currentBalance>89.23</currentBalance>
</x:TransferError>
</detail>
</x:TransferFunds>
</soap:Body>
</soap:Envelope>
21
C# példa
public static string BuildSOAPMessage()
{
MemoryStream st;
st = new MemoryStream(1024);
XmlTextWriter tr = new XmlTextWriter(st,Encoding.UTF8);
tr.WriteStartDocument();
tr.WriteStartElement("soap","Envelope",
"http://schemas.xmlsoap.org/soap/envelope/");
tr.WriteAttributeString("xmlns","xsi",null,
"http://www.w3.org/2001/XMLSchema-instance");
tr.WriteAttributeString("xmlns","xsd",null,
"http://www.w3.org/2001/XMLSchema");
tr.WriteAttributeString("xmlns","soap",null,
"http://schemas.xmlsoap.org/soap/envelope/");
tr.WriteStartElement("Body",
"http://schemas.xmlsoap.org/soap/envelope/");
tr.WriteStartElement(null,"GetAccount",
"http://woodgrovebank.com");
tr.WriteElementString("acctNumber","1234");
tr.WriteEndElement();
tr.WriteEndElement();
tr.WriteEndDocument();
tr.Flush();
22 }
WSDL
Web Service Description Language
Ahol az XML Schema befejeződik ott kezdődik
XML interfészeket definiál
Üzenet szekvencia (Műveletek)
Port
Szolgáltatás
23
WSDL elemek
types – XSD definíciók
message – Több típus
portType – Üzenet váltás
binding – konkrét protokoll és adat formátum
service – Összetartozó végpontok gyűjteménye
(URI, binding)
24
Types
25
MathInput (Add, Subtract, Multiply, Divide)
…
<types>
<xs:schema
targetNamespace="http://example.org/math/types/"
xmlns="http://example.org/math/types/" >
<xs:complexType name="MathInput">
<xs:sequence>
<xs:element name="x" type="xs:double"/>
<xs:element name="y" type="xs:double"/>
</xs:sequence>
</xs:complexType>
</xs:complexType>
<xs:element name="Add" type="MathInput"/>
<xs:element name="AddResponse" type="MathOutput"/>
…
</xs:schema>
</types> ...
</definitions>
Message
…
<message name="AddMessage">
<part name="parameter" element="ns:Add"/>
</message>
<message name="AddResponseMessage">
<part name="parameter"
element="ns:AddResponse"/>
</message>
…
26
Interface
<portType name="MathInterface">
<operation name="Add">
<input message="y:AddMessage"/>
<output message="y:AddResponseMessage"/>
</operation>
<operation name="Subtract">
<input message="y:SubtractMessage"/>
<output message="y:SubtractResponseMessage"/>
</operation>
<operation name="Multiply">
<input message="y:MultiplyMessage"/>
<output message="y:MultiplyResponseMessage"/>
</operation>
<operation name="Divide">
<input message="y:DivideMessage"/>
<output message="y:DivideResponseMessage"/>
</operation>
</portType>
27
Binding
<binding name="MathSoapHttpBinding" type="y:MathInterface">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="Add">
<soap:operation
soapAction="http://example.org/math/#Add"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
...
</binding>
28
Services, SOAP Add üzenet
<service name="MathService">
<port name="MathEndpoint" binding="y:MathSoapHttpBinding">
<soap:address location="http://localhost/math/math.asmx"/>
</port>
</service>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body>
<m:Add xmlns:m="http://example.org/math/types/">
<x>3.14159265358979</x>
<y>3.14159265358979</y>
</m:Add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
29
DEMÓ
Web szolgáltatás készítése
30
A Web szolgáltatás elemei(1)
Az .asmx fájl
Szolgáltatás Súgó oldal
Szolgáltatás metódus súgó oldal
Szolgáltatás leíró oldal
Global.asax
Web.config
A .vsdisco fájl
AssemblyInfo (.cs or .vb)
A /bin mappa
31
Web metódusok
A WebMethod attribútummal ajánlhatjuk ki
Paraméterei
BufferResponse
CacheDuration
Description
EnableSession
MessageName
TransactionOption
32
Web szolgáltatás felfedezés
Disco
Disco.Exe használata
Programozói támogatás
Web Service
33
Web Service Consumer
Disco
Statikus felfedezés
Dinamikus felfedezés
WS-Inspection
34
Disco.exe
Szintaxis
disco [options] URL
Disco.exe
Example
disco /out:d:\disco /u:administrator /p:biffle
http://www.woodgrovebank.com/catalog.disco
35
Programozói támogatás
System.Web.Services.Discovery
DiscoveryClientProtocol
DiscoveryDocument
DiscoveryClientResultCollection
36
Web szolgáltatás proxi-k
Kapcsolatuk a WSDL-el
Proxi generálás Wsdl.exe segítségével
Proxi-k konfigurálása
Web Service
37
Web Service Consumer
Proxi és WSDL
Miért van szükség rájuk?
WSDL használata proxi-k generálásához
38
Wsdl.exe
Szintaxis Wsdl.exe
wsdl [options] {URL | Path}
Példa
wsdl
http://www.woodgrovebank.com/services/bank.asmx?wsdl
Példa
wsdl /l:VB /protocol:HttpGet /out:Bank.vb
http://www.woodgrovebank.com/services/bank.asmx?wsdl
39
Proxi-k beállításai
Url tulajdonság
Bizonyítékok
Timeout
Proxy tulajdonság
AllowAutoRedirect
tulajdonság
Bank theBank = new Bank();
theBank.Url =
"http://eastcoast.woodgrovebank.com/Bank.asmx";
ICredentials credentials = new NetworkCredential
("Adam", "ABarr-user", "woodgrovebank.com");
theBank.Credentials = credentials;
theBank.Timeout = 20000;
IWebProxy proxyObject = new
WebProxy("http://proxyserver:80", true);
theBank.Proxy = proxyObject;
theBank.AllowAutoRedirect = true;
40
Szinkron vs. Aszinkron kliens
A szinkron hívások korlátai
Aszinkron hívások
41
Az előadás tartalma
XSD
SOAP
WSDL
Web szolgáltatás készítés, fogyasztás
42
A következő előadás tartalma
Web szolgáltatások
Biztonság
WS-profilok
43