Hãy Xây Dựng Một Ứng Dụng Thực Tế Liên Quan Đến Nhiều Nền Tảng Dựa Vào Web Service

nav.Select( "//ServiceRequest/Param[@name='customerID']" ); nav.MoveToNextSelected();

string customerID = nav.innerText;

nav.Select( "//ServiceRequest/Param[@name='itemID']" ); nav.MoveToNextSelected();

string itemID = nav.innerText;

nav.Select( "//ServiceRequest/Param[@name='qty']" ); nav.MoveToNextSelected();

string qty = nav.innerText;

/* invoke the orderItem() method in our Legacy object

to place an order and build result XML document based on the outcome. */

try

{

string tranID = legacy.orderItem( customerID, itemID, qty ); res = "<TransactionID>" + tranID + </TransactionID>";

}

catch ( Exception e )

{

res = "<Fault>" + e.Message + </Fault>";

}

break;

case "History" :

/* retrieve the customerID parameter from the Params in the XML document */

nav.Select( "//ServiceRequest/Param[@name='customerID']" ); nav.MoveToNextSelected();

string customerID = nav.innerText;

/* invoke the getOrderHistory() method in our Legacy

object and output result in our resultDoc XML document */ try

{

string[] tranIDs = legacy.getHistory( customerID );

/* get list of transaction IDs of past transaction and build result XML document */

foreach ( string tranID in tranIDs )

{

res = res + "<TransactionID>" + tranID + "</TransactionID>";

}

}

catch ( Exception e )

{

res = "<Fault>" + e.Message + </Fault>";

}

break;

}

/* build and return result XML document */ XmlDocument resultDoc = new XmlDocument();

resultDoc.loadXml( "<ServiceRequestResponse>" + res + "</ServiceRequestResponse>" );

return ( resultDoc );

}

}

Lớp bộ tích hợp thừa kế

legacy_layer.cs: The psuedocode of a sample Legacy Layer.

public class LegacyLayer

{

/* place an order return the new transaction ID or throw an exception if an error occurred. */

public string orderItem( string customerID, string itemID, string qty )

{

/* insert your actual implementation here... */

}

/* get order transaction of a specific customer. return a string array containing the list of the transaction IDs of previous order transaction or throw an exception if an error occurred. */

public string[] getOrderHistory( string customerID )

{

/* insert your actual implementation here... */

}

}

}


BÀI TẬP VỀ NHÀ

1. Hãy xây dựng một ứng dụng thực tế liên quan đến nhiều nền tảng dựa vào Web service

BÀI 4

TÊN BÀI : LIÊN HỆ GIỮA XML VÀ .NET.

Mã bài : 04


Giới thiệu :

Trong nội dung bài học này chúng ta sẽ nghiên cứu sự liên hệ giữa XML và .NET cũng như ứng dụng của XML trong nền tảng .NET.

Mục tiêu thực hiện:

Học xong bài này học viên sẽ có khả năng:

- Hiểu được các vấn đề về XMLP (SOAP)

- Hiểu được quan hệ XML với Biztalk Server

- Hiểu được quan hệ XML với phát triển trên môi trường .NET.

Nội dung chính:

I. Vấn đề XMLP (SOAP)

SOAP <Envelope>

Một thông điệp SOAP là một tài liệu XML mà gồm có một phần tử SOAP gốc

<Envelope>, một phần tử tùy chọn <Header>, và một phần tử <Body>. Nghĩ về điều này như một phong bì thường gửi bưu điện một bức thư tới một bạn ngang qua nước. Phong bì SOAP tương tự đối với phong bì giấy-nó trình bày những phương hướng lộ trình và bức thư. Những phương hướng lộ trình, hay địa chỉ (từ và đến) được đại diện cho trong phần tử

<Header> của một thông điệp SOAP. Chính bức thư được chứa đựng trong thân SOAP. Tất cả thông tin này cần thiết để một cách thành công truyền dữ liệu qua giao thức SOAP.

skeletal_soap.xml: A skeletal SOAP message.

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/ encoding/">

<SOAP-ENV:Header>

<!-- (optional) Contextual header information... -->

</SOAP-ENV:Header>

<SOAP-ENV:Body>

<!-- Serialized object information... -->

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

Tất cả những thông điệp SOAP cần phải bao gồm những khai báo không gian tên thích hợp để những ứng dụng SOAP có thể xử lý chính xác những thông điệp. Thuyết minh SOAP định nghĩa hai không gian tên:

SOAP <Envelope> được định nghĩa bởi không gian tên có URI http://schemas.xmlsoap.org/soap/envelope/, định nghĩa các phần tử và thuộc tính SOAP sử dụng trong phần tử <Envelope>.

Các luật mã hóa mặc định SOAP và kiểu dữ liệu được định nghĩa bởi không gian tên có URI http://schemas.xmlsoap.org/soap/encoding/.

Thuộc tính toàn cục encodingStyle

Thuộc tính SOAP-ENV:encodingStyle được dùng để chỉ báo những quy tắc thường mã hóa thông tin trong một thông điệp SOAP đặc biệt. Những quy tắt mã hóa SOAP mặc định được xác định bởi không gian tên http://schemas.xmlsoap.org/soap/encoding/ . Thuộc tính này có thể xuất hiện trên bất kỳ phần tử nào. Khi được áp dụng, phạm vi của nó bị hạn chế đối với nội dung của phần tử đó và tất cả các phần tử đứa trẻ không phải đè thuộc tính với namespace của mình. Chú ý rằng không có sự mã hóa mặc định được định nghĩa cho một thông điệp SOAP, vì vậy bạn phải bao gồm thuộc tính encodingStyle ít nhất một lần trong những thông điệp SOAP của chúng ta. Thường thì chúng ta sẽ bao gồm nó trong bản thân khai báo <Envelope>, tập tin sau là một ví dụ:

<Header>

Phần tử <Header> được dùng để đóng gói thông tin mà không bị ràng buộc đối với một phương thức đặc biệt, nhưng cung cấp thông tin văn cảnh thay vào đó. Những ví dụ tiêu biểu của việc sử dụng phần tử <Header> là sự an toàn, quản lý giao dịch và thông tin thanh toán.

Đây là vài quy tắc được định nghĩa bởi thuyết minh SOAP cho phần tử <Header > được liệt kê như sau:


Phần tử <Header> là tùy chọn , nhưng, nếu được ấn định, phài là phần tử con đầu tin trong <Envelope>.

Phần tử <Header> phần tử phải sử dụng các luật mã hóa SOAP trừ phi đầu mục chỉ định một tập hợp các luật khác. Yêu cầu này được hoàn thành sử dụng thuộc tính SOAP- ENV:encodingStyle.

Tất cả phần tử con <Header> phải đủ khả năng không gian tên.

Phần tử <Header> có thể chứa thuộc tính SOAP-ENV:mustUnderstand. soap_header.xml: Một vài ví dụ về các phần tử SOAP <Header>.

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/ encoding/"/>

<SOAP-ENV:Header>

<a:Authentication xmlns:a="some-URI">

<UserID>foo</UserID>

<Password>an-encoded-password</Password>

</a:Authentication>

</SOAP-ENV:Header>

<SOAP-ENV:Body>

<!-- Serialized object information... -->

</SOAP-ENV:Body>

</SOAP-ENV:Envelope> mustUnderstand

Trong tập tin soap_header2.xml khái niệm của sự chứng thực của yêu cầu dịch vụ. Để xác nhận rằng một dịch vụ hiểu và có thể xử lý một phần tử đặc biệt <Header>, bạn có thể đánh dấu chỉ định những phần tử <Header> với thuộc tính SOAP-ENV:mustUnderstand. Thuộc tính này chỉ ra tới một bộ xử lý tương hợp SOAP mà có liên hệ phần tử <Header> phần tử với sự xử lý của của phương thức được gọi, nếu lý do nào đó bộ xử lý SOAP từ xa không thể hiểu hay xử lý nó, bạn không muốn phương thức được gọi để thực thi.

Giá trị của thuộc tính SOAP-ENV:mustUnderstand là 1 hoặc 0. Sau đây là một ví dụ: soap_header2.xml: The SOAP-ENV:mustUnderstand attribute.

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Header>

<a:Authentication xmlns:a="some-URI" SOAP-ENV:mustUnderstand="1">

<UserID>foo</UserID>

<Password>an-encoded-password</Password>

</a:Authentication>

</SOAP-ENV:Header>

<SOAP-ENV:Body>

<!-- Serialized object information... -->

</SOAP-ENV:Body>

</SOAP-ENV:Envelope> actor

Khi một thông điệp SOAP hành trình từ bộ khởi đầu đến điểm đến cuối cùng của nó, nó trực tiếp không cần hành trình giữa nguồn và nơi đến. Thông điệp có lẽ đã đi qua xuyên qua một tập hợp những trung gian SOAP, mỗi lần nhận được thông điệp sẽ được chuyển đến bộ thu tiếp theo, cho đến khi thông điệp đạt đến trạm cuối cùng của nó. Bởi vậy, không phải tất cả thông điệp những bộ phận của một thông điệp SOAP có thể được dự định cho trạm cuối

cùng; nó được định hướng tại một hoặc nhiều trong số những trung gian trên đường dẫn thông điệp.

Chúng ta sử dụng thuộc tính SOAP-ENV:actor để cho phép một thông điệp SOAP thông tin của <Header> liên quan đối với một trạm nhận chỉ định. Giá trị của thuộc tính SOAP- ENV:actor là một URI được dùng xác định trạm nhận của phần tử <Header>. Thuyết minh SOAP định nghĩa một URI đặc biệt: http://schemas.xmlsoap.org/soap/actor/next, để chỉ ra phần tử <Header> liên hệ được dự định cho trạm nhận SOAP đầu tiên, trung gian hay cách khác.

<Body>

Phần tử <Body > chứa đựng dữ liệu liệt kê thực tế của phương thức gọi chính nó. Phần tử <Body> được sử dụng cho một sự đáp lại của sự gọi phương thức, mà sẽ hay là thông tin liên quan đến một yêu cầu hợp lệ hay một lỗi SOAP nếu sự triệu gọi thất bại. Thuyết minh SOAP định nghĩa ba kiểu phần tử <Body>

<Body> Call chứa thông tin yêu cầu cho một phương thức gọi, chẳng hạn tên phương thức và tham số.

<Body> Response chứa thông tin đáp trả cho một phương thức gọi thành công.

<Body> Fault chứa mã lỗi và các thông tin khác cho một phương thức gọi không thành công.

Call <Body>

Phần tử con đầu tiên của một phần tử <Body> Call là nhãn theo tên phương pháp. Những phần tử nhúng Khi xếp theo thứ tự tham số, với mỗi tham số đặt tên theo dấu hiệu phương thức. Chẳng hạn, trong phương thức gọi TranslationService có lẽ đã có một phương pháp với dấu hiệu C# sau đây:

string TranslateText(string SourceLanguage, string TargetLanguage, string Text) Hình dung công dụng thông qua ví dụ sau:

// Translates an English sentence to French

string translatedText = TranslateText( "en", "fr", "I speak French" ); soap_callbody.xml, hiển thị một thông điệp SOAP tương ứng: soap_callbody.xml: SOAP Call <body> example.

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Header>

<a:Authentication xmlns:a="some-URI" SOAP-ENV:mustUnderstand="1">

<UserID>foo</UserID>

<Password>an-encoded-password</Password>

</a:Authentication>

</SOAP-ENV:Header>

<SOAP-ENV:Body>

<m:TranslateText xmlns:m="some-URI">

<SourceLanguage>en</SourceLanguage>

<TargetLanguage>fr</SourceLanguage>

<Text>I speak French</Text>

</m:TranslateText>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

<Body> Response

<Body> Response chứa đựng thông tin dịch vụ SOAP trả lại người gọi sau khi một sự gọi phương pháp thành công.

soap_responsebody.xml: SOAP Rresponse <Body> example.

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>

<m:TranslateTextResponse xmlns:m="some-URI">

<Text_fr>Je parle Francais</Text_fr>

</m:TranslateTextResponse>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

<Fault> trong <Body>

Khi một phương thức gọi lỗi, thay vì một <Body> Response bình thường, một bộ xử lý SOAP sẽ sử dụng một sự cố <Fault> trong <Body> của thông điệp SOAP đáp trả như trong ví dụ sau:

soap_faultbody.xml: SOAP <Fault> in the <Body>.

<SOAP-ENV:Envelope

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>

<SOAP-ENV:Fault>

<faultcode>SOAP-ENV:Server</faultcode>

<faultstring>Translator not found</faultstring>

<detail xmlns:e="some-URI">

<e:ErrorCode> 014

</e:ErrorCode>

<e:ErrorMsg>

No suitable Translator found for "en-fr" translation

</e:ErrorMsg>

</detail>

</SOAP-ENV:Fault>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

Thuyết minh SOAP yêu cầu rằng <Fault> phải là phần tử con đầu tiên của phần tử

<Body>.

Thuyết minh SOAP định nghĩa các phần tử con sau:

Phần tử bắt buộc <faultcode> có thể được sử dụng bởi những ứng dụng cho thuật toán tự động cho lỗi. Những giá trị <faultcode> được định nghĩa trong một thái độ dễ mở rộng tương tự như 1xx, 2xx, 3xx, và sự đáp lại các mã HTTP cơ bản. Tuy nhiên, thay vì những giá trị số những mã được định nghĩa khi những tên phân loại XML. Dấu chấm dùng tách biệt các giá trị lỗi từ trái qua bên phải.

Phần tử bắt buộc <faultstring> cung cấp một diễn giải có thể đọc được của một lỗi.

Phần tử tùy chọn <faultactor> cung cấp thông tin về lý do tại sao lỗi phát sinh bên trong đường dẫn message.

Phần tử bắt buộc <detail> cung cấp chỉ định lỗi ứng dụng liên hệ với xử lý của phần tử

<Body>. Một mục chi tiết, là một phần tử con tức thời của phần tử <detail>, phải là một tên hoàn toàn có đủ tiêu chuẩn

Các mã lỗi định nghĩa trong SOAP

Mã lỗi

Nghĩa

VersionMis match

Bộ xử lý tìm thấy một không gian tên sai cho phần tử SOAP.

MustUnderst

and

Một phần tử <Header> đánh dấu với thuộc tính SOAP- ENV:mustUnderstand hoặc là không hiểu hay đúng mức tuân theo bởi bộ xử lý.


Client

Thông điệp không đúng được thành lập hay không chứa đựng thông tin thích hợp để thành công. Nói chung, thông báo không nên được gửi lần nữa không có một vấn đề sự thay đổi sửa chữa.


Server

Thông báo không thể được xử lý bởi bộ xử lý cho những lý do không trực tiếp có thể quy cho đối với chính nội dung của thông điệp, nhưng tới sự xử lý của thông điệp.

Có thể bạn quan tâm!

Xem toàn bộ 258 trang tài liệu này.

Lập trình web nâng cao XML - Trường CĐN Đà Lạt - 30

Phát triển các ứng dụng SOAP Sử dụng các dịch vụ Web

ASP.NET hỗ trợ tuyệt vời để tạo ra những dịch vụ Web XML dựa vào các máy chủ SOAP. Hỗ trợ những dịch vụ Web XML được cung cấp qua ASP.NET. Những tập tin asmx, là tập tin văn bản, tương tự tập tin .aspx. Qua vài trang web tiếp theo chúng ta sẽ quan sát một số ví dụ đơn giản xây dựng cả những trình khách lẫn máy chủ. Tất nhiên, sẽ tương tác như những dịch vụ Web XML.

Máy chủ

hello.asmx, cho thấy một tập tin .asmx dịch vụ Web. Chương trình này không trả về gì hơn một chuỗi đến trình khách yêu cầu.

hello.asmx: A simple Web Service.

<%@ WebService Language="C#" Class="Hello" %> using System;

using System.Web.Services; public class Hello : WebService

{

[WebMethod] public String SayHello( String Name )

{

return ( "Hello " + Name );

}

}

Dịch vụ Web đặc biệt được cài đặt trong C#, nhưng chúng ta có thể cũng sử dụng bất kỳ ngôn ngữ khác được xây dựng .NET Framework, chẳng hạn như Visual Basic.NET.

Dòng đầu tiên trong hello.asmx khai báo rằng đây là một dịch vụ Web XML và đặt ngôn ngữ (C# trong trường hợp này) được dùng để cài đặt dịch vụ này. Tiếp theo chúng tôi nhập khẩu không gian tên System.Web.Services và khai báo rằng lớp của chúng ta được dẫn xuất từ lớp dựa trên WebService. Cuối cùng, để chỉ báo rằng phương thức GetStockPrice của chúng ta sẽ có thể tiếp cận như một phần của dịch vụ, chúng tôi đánh dấu nó với thuộc tính tùy biến [WebMethod].

Để cho phép những ứng dụng trình khách để tiêu thụ dịch vụ Web này bạn cần để tạo ra một lớp uỷ nhiệm DLL. DLL này bao bọc tất cả mã và sự gọi trong dịch vụ Web có liên hệ vào trong một sự gọi phương thức đơn giản tương tự như một đối tượng COM. Trong tài liệu .NET Framework SDK, chúng ta sẽ sử dụng một công cụ được gọi là WebServiceUtil.exe để thực hiện nhiệm vụ này. Sử dụng như sau:

WebServiceUtil /c:proxy /pa:http://localhost/Hello.asmx?SDL /n:nsHello

để phát sinh một lớp uỷ nhiệm gọi là Hello.cs. Kế tiếp bạn cần biên dịch hello.cs vào trong một DLL vợi lệnh sau:

csc /out:Hello.dll /t:library /r:system.data.dll /r:system.web. services.dll /r:system.xml.serialization.dll Hello.cs

Trình khách

Dịch vụ web hello.asmx có thể được truy nhập bởi một khách hàng mà thực hành để tiêu thụ những thông điệp SOAP. Chẳng hạn, chúng tôi sẽ phát triển một trang ASP.NET đơn giản với ý định sử dụng dịch vụ web XML này.

hello_client.aspx: An ASP.NET consumer of the Hello Web Service.

<%@ Import Namespace="nsHello" %>

<html>

<script language="VB" runat="Server">

Sub Greeting( Src as Object, E as EventArgs )

Dim h as New Hello

lblGreeting = h.SayHello( edtName.Value ) End Sub

</script>

<body>

<form runat="SERVER"> Your name:

<ASP:INPUT ID="edtName" TYPE="Text" RUNAT="Server"/><br/>

<ASP:BUTTON TEXT="Say Hello!" onclick="Greeting"/>

</form>

<h1 ID="lblHello" RUNAT="Server"/>

</body>

</html>

Trang ASP.NET này đầu tiên nhập khẩu lớp DLL uỷ nhiệm sử dụng không gian tên được định nghĩa. Sự gọi thực tế tới dịch vụ Hello xảy ra trong thủ tục Greeting trong tập tin HelloClient.aspx. Từ khóa New được dùng để khởi tạo đối tượng. Một lần được khởi tạo, chúng tôi đơn giản triệu gọi phương thức SayHello để làm công việc.

Chúng ta hiểu rằng phương thức lập trình và kỹ thuật lập trình Microsoft, cách tiếp cận này tương tự tới bạn sử dụng một đối tượng COM như thế nào. Đằng sau những gói DLL lớp ủy thác dịch vụ Web phương thức của chúng ta được gọi trong một thông điệp SOAP và chuyển chúng thông qua dịch vụ web của chúng ta để xử lý. Dịch vụ Web Hello phân tích thông điệp SOAP và triệu gọi phương thức SayHello. Kết quả được đóng gói khi một thông điệp đáp trả SOAP và một lần nữa đi qua bởi uỷ nhiệm phân loại DLL. Và tất cả thời gian này bạn chỉ nghĩ rằng bạn đang làm một phương pháp gọi đơn giản!

Sử dụng các thành phần

Microsoft .NET Remoting cho phép cho những người phát triển sản xuất quản lý từ xa, COM/COM+ tự nhiên, và những thành phần dịch vụ (Quản lý những thành phần dịch vụ bởi những dịch vụ COM+. Cái gì làm sự cài đặt .NET quan trọng là những thành phần này được xây dựng như điểm cuối SOAP từ bất kỳ trình xử lý nào, kể cả những ứng dụng console, những ứng dụng GUI, những dịch vụ Windows NT, và IIS. Bởi vì họ được xây dựng trên tiêu chuẩn này cho truyền thông, số lượng những ứng dụng mà cuối cùng giao diện với những thành phần có thể đang gia tăng, và những cơ hội cho thành công trong những môi trường hỗn tạp được tiến bộ.

Máy chủ

hello.cs, hiển thị một .NET đơn giản quản lý thành phần trưng bày phương thức SayHello.

Trong hello.cs đối tượng Hello có thể được điều khiển từ xa bằng việc mở rộng lớp MarshalByRefObject. Cái này cho phép phương thức SayHello sẽ được truy nhập thông qua SOAP khi đối tượng này được phơi bày bởi một chủ nhà thích hợp mà đóng vai điểm cuối SOAP. hello_host.cs thể hiện sự xây dựng một dịch vụ chờ đợi một kết nối. Người sử dụng có thể dừng dịch vụ, bằng cách ấn phím Enter.

hello.cs: A managed component. using System;

namespace nsHello

{

/* Define the Service */

public class Hello : MarshalByRefObject

{

/* This method will be called remotely by our client */ public String SayHello( String Name )

{

return ( "Hello " + Name );

}

}

}

hello_host.cs: Creates a service listening for connections. using System;

using System.IO;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels.HTTP; public class HelloHost

{

public static void Main( String[] args )

{

/* Manually load the http channel. 1099 is the port # */ ChannelServices.RegisterChannel( new HTTPChannel( 1099 ) );

/* Register the wellknown server type */ RemotingServices.RegisterWellKnownType(

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 19/11/2023