24/05/2018, 19:25

Sử dụng XML Web Services

Trước khi tạo .NET Compact Framework XML Web service client, XML Web Service client phải sử dụng được. Trong phần này chúng ta tạo một Web service, và tạo một a .NET Compact Framework client để sử dụng Web service. XML Web service trả về ...

Trước khi tạo .NET Compact Framework XML Web service client, XML Web Service client phải sử dụng được. Trong phần này chúng ta tạo một Web service, và tạo một a .NET Compact Framework client để sử dụng Web service. XML Web service trả về thông tin của một cá nhân.

Thông tin của người đó được lưu trong CSDL Microsoft SQL Server. Khi một yêu cầu được tạo ra, XML Web service sẽ truy vấn một trích dẫn ngâu nghiên và trả về thông tin trích dẫn. Chúng ta cần phải thiết lập CSDL này trước khi chúng ta có thể chạy ví dụ này.

Để tạo XML Web service trong Visual Studio.NET, sử dụng ASP.NET Web Service template. Tên dự án là

QuotableQuotesWebService
. XML Web service có tên là
Service1
sẽ được tạo file
Service1.asmx.
Thay đổi tên XML Web service thành
QuoteService
và file nguồn
.aspx
QuoteService.aspx.

XML Web service sẽ đưa ra một phương thức web,

GetQuote
. Phương thức này trả về thông tin trích dẫn. Thông tin trích dẫn được lấy từ CSDL Microsoft SQL Server. Có một thủ tục trong CSDL
QuotableQuotes
có tên là
GetQuote
, thủ tục này chúng ta sẽ sử dụng để truy vấn thông tin trích dẫn. Microsoft Visual Studio.NET sẽ trợ giúp trong quá trình viết mã lệnh để tác động đến thủ tục này. Trước tiên mở Server Explorer và tạo stored procedure
GetQuote
trong CSDL
QuotableQuotes
. Kéo stored procedure
GetQuote
vào trong phần thiết kế XML Web service. Chúng ta tạo hai đối tượng:
sqlConnection1
sqlCommand1
. Đối tượng
sqlConnection1
có kiểu
SqlConnection
và thể hiện kết nối tới CSDL
QuotableQuotes
. Đối tượng
sqlCommand1
có kiểu là
SqlCommand
và thể hiện SQL command sẽ nhận thông tin trích dẫn từ stored procedure. Đổi tên
sqlConnection1
sqlCommand1
lần lượt thành
quoteConnection 
cmdGetQuote
.

Trước khi thực thi

GetQuote,
cần phải có phương thức giúp đỡ để tạo thông tin trích dẫn ngâu nghiên. SqlCommand
cmdGetQuote 
đưa đến một tham số. Tham số này là ID của bản ghi thông tin trích dẫn trong CSDL. Trong CSDL mỗi thông tin trích dẫn có một trường khóa có kiểu
integer
. Trường khóa này tự động tăng, mỗi lần tăng nên một, và giá trị đầu tiền là 0.
QuotableQuote
XML Web service sẽ trả về thông tin trích dẫn ngẫu nghiên. Để làm điều này, trong mã nguồn phải tạo một số ngẫu nghiên từ 0 và giá trị lớn nhất của trường khóa trong CSDL. Số lớn nhất đó phải nhận từ CSDL. Có một stored procedure có tên là
GetLargestQuoteIdentifier
trong CSDL làm điều này. Đặt
GetLargestQuoteID
vào stored procedure, và kéo vào phần thiết kế. Nó sẽ tạo một đối tượng SqlCommand. Đổi tên thành
cmdGetLargestID
. Đoạn mã sau mô tả cách nhận giá trị trường ID lớn nhất từ CSDL. Đoạn mã này sẽ ở trong lớp
 QuoteService
.

Listing 7.1

public Int64 LargestID
{
get
{
object largestID = cmdGetLargestID.ExecuteScalar();
if(largestID== null || !(largestID is Int64))
return -1;

return (Int64)largestID;
}
}

Trước khi viết mã lệnh để nhận giá trị lớn nhất của trường khóa từ bảng

Quotes
. Trước tiên, đối tượng
cmdGetLargestID SqlCommand
được sử dụng để nhận giá trị lớn nhất trường khóa từ CSDL. Khi giá trị nhận về được kiểm tra đúng. Giá trị -1 được trả về nếu giá trị không hợp lệ.

Sau khi nhận giá trị của trường khóa lớn nhất, một giá trị IP ngâu nghiên được tạo. Làm điều này cùng với lớp

System.Random
. Lớp
System.Random
thể hiện tạo một số ngẫy nghiên. Phương thức
Next
sẽ được sử dụng để nhận một số nguyên ngâu nghiên
(Int32).
Phương thức
Next
có thể chấp nhận một số nguyên
(Int32),
số này thể hiện giới hạn trên của số ngẫu nghiên để phát sinh. Trong ví dụ này giá trị lớn nhất của ID sẽ được tạo được thông qua như là một tham số.

Phương thức sẽ trả về cấu trúc dữ liệu khách hàng, cấu trúc này chứa đựng thông tin trích dẫn. Listing 7.2 chứa đựng lớp

Quote
, lớp này lưu trữ thông tin trích dẫn. Lớp sẽ đực đặt trong file
QuoteService.aspx
bên trong của không gian tên.

Li st ing 7 . 2

public class Quote
{
public string String; 
public string Author; 
public string Date;
}

Phương thức

GetQuote
phải được thực thi. Phương thức
GetQuote
Web cần phải hoàn thành những công việc sau:

c 1: Phát sinh một giá trị

Quote
ID ngẫy nghiên.

c 2: Lấy dữ liệu trích dẫn từ CSDL. c 3: Điền vào cấu trúc dữ liệu

Quote
. c 4: Trả về cấu trúc dữ liệu
Quote
.

Trong đoạn mã Listing 7.3 đưa đến phương thức Hello World trong file

QuoteService.aspx.

Listing 7.3

[WebMethod]
public Quote GetQuote()
{
quoteConnection.Open();

try
{
Int64 largestID = LargestID;
if(-1 == largestID)
return null;
Random rand = new Random(DateTime.Now.Millisecond);
Int64 randomQuoteId = rand.Next((int)largestID);
cmdGetQuote.Parameters["@id"] =
new SqlParameter("@id", randomQuoteId);
SqlDataReader reader = cmdGetQuote.ExecuteReader();
if(!reader.Read())
return null;
Quote q = new Quote();
q.String = reader.GetString(0);
// Get Quote String q.Author = reader.GetString(1);
// Get author's name q.Date = reader.GetString(2);
// Get the spoken date
return q;
}
finally
{
quoteConnection.Close();
}
}

Trước tiên kết nối với CSDL

QuotableQuotes
đã được mở bằng phương thức Open trên đối tượng
quoteConnection
. Tiếp theo một giá trị ngẫy nghiên giữa 0 và giá trị lớn nhất được phát sinh bằng phương thức Next trên lớp
System.Random
. ID được kiểm tra tính hợp lệ. Nếu ID hợp lệ, giá trị đó được thiết lập như là tham số có tên là @id của đối tượng
cmdGetQuote SqlCommand
. Tiếp theo phương thức
ExecuteReader
của đối tượng
SqlComman
được gọi. Phương thức này thực thi câu lệnh đối với CSDL Microsoft SQL Server và trả về một đối tượng
SqlDataReader
, đối tượng này cung cấp truy cập vào dữ liệu trích dẫn. Sau đó
SqlDataReader
điền vào cấu trúc dữ liệu Quote. Cuối cùng, cấu trúc dữ liệu Quote được trả về, và khối
finally
đảm bảo rằng kết nối CSDL được đóng trong trường hợp có ngoại lệ. Trước khi lớp trong không gian tên
SqlClient
có thể được sử dụng, không gian tên
System.Data.SqlClient
phải được đưa vào trong file
QuoteService.aspx
.

Mặc định , một Web service mới được đưa vào không gian tên http://tempura.org. Microsoft khuyến cáo rằng mỗi XML Web service có một không gian tên XML duy nhất. Điều này cho phép ứng dụng client chỉ ra sự khác biệt nó với các dịch vụ khác trên Web. Có thể hoàn thành bằng cách áp dụng thuộc tính

WebServiceAttribute
đối với lớp Web service. Thêm các dòng lệnh sau vào lớp
QuoteService
:
[WebService(Namespace="http://netcfkickstart/QuoteService",
 Description="Provides access to famous quotes")]
    

Thay đổi thuộc tính không gian tên của

QuoteService
như là thêm một mô tả ngắn gọn về Web service.

Cùng với thuộc tính

WebServiceAttribute
ứng dụng vào Web service, QuotableQoutes Web service có thể được dịch và thử. Nhấn phím F5 để dịch và gỡ lỗi XML Web service.
QuoteService
đưa đến trang Web. Trang Web này chứa đựng chuỗi mô tả từ thuộc tính
WebServiceAttribute
. Trang chứa một nhãn liên kết
Service Description
. Liên kết này sẽ hiển thị định dạng file WSDL cho dịch vụ. Có liên kết cùgn với text
GetQuote
. Chọn liên kết đó sẽ đưa đến trang Web cho phép thử phương thức
GetQuote
Web.

Trang kiểm thử này cung cấp một vài thông tin. Chọn vào nút

Invoke
trên trang Web sẽ gọi phương thức Web và hiển thị thông tin trả về trong Internet Explorer. Sai đây XML là một ví dụ về kết quả trả về từ trang
GetQuote
:
<?xml version="1.0" encoding="utf-8" ?>
    <Quote xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <String>
"Once you eliminate the impossible, whatever remains,
 no matter how improbable, must be the truth."
    </String>
    <Author>Sherlock Holmes</Author>
    <Date>1859-1930</Date>
</Quote>
    

Bên cạnh sự cung cấp khả năng kiểm thử Web service, trang này còn cung cấp ba ví dụ về cách yêu cầu Web service và ví dụ trả về. Ví dụ này bao gồm định dạng cho

HTTP-POST
,
HTTP-GET
, và
SOAP
.

Sử dụng giao thức HTTP và thông điệp SOAP, Web service client có thể gửi yêu cầu và thể hiện thông tin trả về từ Web server. Hình 7.1 mô tả thời gian tồn tại của một phương thức Web gọi từ client tới Web server.

Thời gian tồn tại của phương thức Web gọi một Web service.

Sau đây là danh sách mô tả 9 bước trong thời gian tồn tại của phương thứcWeb method.

c1: Ứng dụng client tạo một thể hiện lớp proxy. Proxy là lớp thông điệp giao tiếp giữa ứng dụng client và Web service. Ứng dụng client gọi một phương thức trên lớp proxy

c2: Proxy, sử dụng kiến trúc Web service bên phía client, tuần tự hóa XML Web service yêu cầu và đóng gói nó trong thông điệp SOAP.

c 3: Thông điệp SOAP sau đó gửi tới Web server thông qua HTTP.

c 4: Kiến trúc Web service phía server nhận và hủy tuần tự hóa thông điệp SOAP.

c5: Sử dụng thông điệp SOAP, lớp thể hiện Web service được tạo. Tiếp theo, đối số của phương thức Web được tạo từ thông điệp SOAP. Cuối cùng, phương thứ Web được gọi cùng với đối số riêng.

c6: Kiến trúc Web service phía server đóng gói đưa ra tham số và trả về giá trị vào thông điệp SOAP.

c 7: Thông điệp SOAP được gửi trở lại client thông qua HTTP.

c8: Kiến trúc Web service phía client nhận thông điệp SOAP và hủy tuần tự hóa tham số đưa ra và trả về giá trị. Giá trị được trả về lớp proxy.

c 9: Lớp proxy trả về tham số đầu ra và trả về giá trị tới ứng dụng client.

Bây giờ chúng tạo một client cho

QuotableQuotes
XML Web service. Bắt đầu tạo một ứng dụng Smart Device Application. Thiết kế giao diện độ họa giống hình 7.2. Mã lệnh để gọi XML Web service sẽ được đưa vào trong sự kiện click trên nút có nhãn
Get Quote
. Trước tiên thêm một tham chiếu đên XML Web service trong dự án Smart Device Application. Giao diện người sử dụng QuotableQuotes client application

Thêm Web Reference vào Client Application

Bây giờ, Web tham chiếu đến dịch vụ cần thiết thêm vào dự án client. Để làm điều này, vào Solution Explorer, bấm chuột phải vào mục

Reference
, và chọn
Add Web References 
.... Hộp thoại Add Web Reference như hình (hinh sau) Hộp thoại Web Reference.

Hộp thoại Add Web Reference giúp xác định Web Services và sử dụng chúng trong ứng dụng. Hộp thoại hiển thị bốn liên kết. Một liên kết cho phép chúng ta xem tất cả XML Web services trên máy. Ba liên kết khác liên kết đến ba UDDI servers/directories. Liên kết "Browse UDDI Servers on the local machine" cho phép chúng ta duyệt UDDI servers trên mạng cục bộ.

hai liên kết khác có nhãn là UDDI Directory và UDDI Directory cung cấp truy cập tới dịch vụ đã được đăng ký với Microsoft. Liên kết "UDDI Directory" duyệt UDDI business registry để tìm công ty và sản phẩm Web services. Liên kết "Test Microsoft UDDI Directory" xác định XML Web services kiểm thử, có nghĩa là được sử dụng trong quá trình phát triển.

Trong ví dụ này

QuotableQuotes
XML Web service sẽ không đăng ký với UDDI. Thay vì đăng ký
QuotableQuotes 
XML Web service cùng với UDDI, địa chỉ trang
QuoteService.aspx
sẽ được đưa vào trong hộp thoại Add Web Reference. Đưa vào địa chỉ URL sau,
http://localhost/QuotableQuotesWebService/QuoteService.asm
x
, vào trong hộp text
Address 
và bấm
Enter
hoặc nút
Go
.

Hộp thoại sẽ download file WSDL cho QuoteService Web service. Quá trình download được hoàn thành, bâm vào nút Add Reference.

Xem lớp Proxy

Khi thêm nút Add Reference được bấm, Microsoft Visual Studio.NET phát sinh một lớp proxy, lớp này sẽ quản lý tương tác giữa ứng dụng QuotableQuotes Web service. Trong một số trường hợp file class proxy có thể cần hiển thị hoặc thay đổi, nhưng mặc định Solution Explorer không hiển thị file class proxy. Có thể thay đổi bằng cách chọn nút Show All Files trong Solution Explorer. Bây giờ mở rộng nút Web References và nút bên dưới Reference.map. Hiện ra một nút có nhãn Reference.cs. Bấm đúp vào nút đó sẽ hiển thị mã nguồn của lớp proxy.

Có một vài thứ sẽ được gọi từ lớp proxy. Trước tiên, lớp proxy đưa đến khả năng mã hóa client để chỉ ra URL sẽ sử dụng khi giao tiếp với XML Web service. Lớp proxy có thuộc tính URL kiểu chuỗi thể hiện địa chỉ URL trang .aspx của XML Web service. Từ khi đó Windows CE và Pocket PC emulators có một địa chỉ IP khác tất cả các địa chỉ máy khác đang chạy, chúng ta sẽ không có khả năng xác định XML Web service bằng cách sử dụng địa chỉ URL mặc định trong lớp proxy bằng cách sử dụng localhost như là tên server. Thay vì, sử dụng tên server hoặc địa chỉ IP, trong phần này chúng ta nên sử dụng địa chỉ IP để ngăn ngừa lỗi cùng với giải pháp tên server.

Thứ hai, trong file lớp proxy, tồn tại một lớp có tên

Quote
. Lớp này tương tự với lớp
Quote
đã được tạo trên phía server để lưu dữ thông tin trích đẫn. Trong Listing 7.4 chứa đựng khai báo lớp
Quote
từ file mã nguồn của lớp proxy.

Listing 7.4

[System.Xml.Serialization.XmlTypeAttribute
( Namespace="http://netcfkickstart/QuoteService")] 
public class Quote { /// <remarks/>
    public string String;
    /// <remarks/>
    public string Author;
/// <remarks/>
public string Date;
    }
    

Thuộc tính

System.Xml.Serialization.XmlTypeAttribute
chỉ ra kiến trúc XML Web service phía client để sử dụng không gian tên http://netcfkickstart/QuoteService khi tuần tự hóa một đối tượng có kiểu này. Lớp Quote phải khai báo trong proxy, vì vậy client và server có thể sử dụng cấu trúc dữ liệu giống nhau khi tương tác. Tất cả cấu trúc dữ liệu khách hàng được đưa ra qua đường XML Web service sẽ được khai báo để sử dụng bằng client trong file mã nguồn lớp proxy.

Sử dụng QuotableQuotes Web Service

Bây giờ chúng thêm một dự án client và lớp proxy đã được tạo ra, XML Web service có thể sử dụng bằng ứng dụng clietn. Mở phần thiết kế cho giao diện đồ họa client, và bấm đúp vào nút

Get Quote.
Sau đó hiển thị phần nhập mã lệnh cho sự kiện click của nút, Trước khi thực thi phương thức này, không gian tên của lớp proxy cần phải được thêm vào Form1.cs. Lớp proxy đã được tạo trong không gian tên dưới không gian tên của client. Thêm vào đoạn mã sau trong:
using QuotableQuotesClient.QuoteServiceWebReference;
    

Thao tác đơn giản cần để tạo một thể hiện của lớp proxy, gọi phương thức GetQuote, và hiển thị thông tin trích dẫn trong giao diện đồ họa. Thực thi thao tác bằng cách sử dụng đoạn mã trong Listing 7.5.

Listing 7.5

private void btnGetQuote_Click(object sender, System.EventArgs e)
{
QuoteService qs = new QuoteService(); Quote quote = qs.GetQuote();
if(null == quote)
{
MessageBox.Show("An error occurred retrieving a quote");
Return;
}
UpdateQuoteUI(quote);
}

UpdateQuoteUI
là phương thức trợ giúp trích đoạn dữ liệu từ đối tượng Quote và cập nhật ứng dụng giao diện đồ họa. Listing 7.6 chứa đoạn mã cho phương thức
UpdateQuoteUI
.

Listing 7.6

private void UpdateQuoteUI(Quote quote)
{
lblQuote.Text = quote.String;
lblAuthor.Text = "- " + quote.Author;
lblDate.Text = ( quote.Date == "Unknown" ) ?
string.Empty :
quote.Date;
}

Asynchronous Consumption of the Simple Web Service

QuotableQuotes XML Web service đã được sử dụng trong quản lý đồng bộ. Đối tượng proxy được tạo, và phương thức

 GetQuote
Web được gọi. Mã hóa sau đó đợi cho phương thức
GetQuote
trả lời. Trong khi công việc nhận được hoàn thành, nó luon luon không hành động. Cài đặt, hình dùng client đang cầu khẩn một XML Web service mà khối xử lý ttheo thứ tự yêu cầu.

Lớp proxy cung cấp hai phương thức để thao tác với trạng thái không đồng bộ Web XML service gọi:

eginWebMethod
EndWebMethod
. Trong mỗi trường hợp
WebMethod
cùng với tên của phương thức Web. Ví dụ, proxy
QuoteService
tạo ra phương thức
BeginGetQuote
EndGetQuote
.

Phương thức

BeginWebMethod
có hai tham số trong phần thêm vào tham số
WebMethod
đưa đến. Cho đến khi
GetQuote
không chấp nhận bất kỳ tham số nào,
BeginGetQuote
chỉ chấp nhận hai tham số. Trước tiên là tham số của
System.AsyncCallback
. Thể hiện phương thức sẽ được gọi trong WebMethod đã được hoàn thành. Tham số thứ hai là kiểu đối tượng và có thể bất kỳ cái gì mà chúng ta muốn thể hiện trạng thái của WebMethod gọi.

Để tạo một trạng thái client không đồng bộ bằng cách tạo một hàm gốc gọi lại trên client. Phương thức phải là public hay static. Nó phải không có giá trị trả ề và chấp nhận một tham số của kiểu

System.IAsyncResult
. Tham số này thể hiện kết quả của async gọi. Nó cho phép truy cập tới trạng tháo chúng ta thông qua BeginWebMethod. Thêm các phương thức sau vào client:
public static void GetQuoteCallBack(IAsyncResult ar)
    {
      MessageBox.Show("GetQuote completed");
    }
    

Bây giờ chúng ta thay đổi sự thực thi của nút thao tác gọi trạng thái không đồng bộ XML Web service. Trước tiên thay thế thực thi hiện tại của nút thao tác cùng với sự thực thi từ mã

Listing 7.7

private void btnGetQuote_Click(object sender, System.EventArgs e)
{
QuoteService qs = new QuoteService();
// Set the url of the proxy to the proper url of the web service

AsyncCallback getQuoteCB = new AsyncCallback( QuotableQuotesClient.Form1.GetQuoteCallBack);

object[] callBackState = {qs, this};
qs.BeginGetQuote(getQuoteCB, callBackState);
}

Đoạn mã trước tạo một thể hiện của Web service. Đối tượng

AsycnCallback
được tạo thể hiện một con trỏ phương thức
GetQuoteCallBack
trên client. Cuối cùng Web service gọi bắt đầu sử dụng phương thức
BeginGetQuote
. Phương thức này trả về kết quả trước khi phương thức Web gọi hoàn thành.

Listing 7.8 chứa đựng sự thực thi của phương thức

GetQuoteCallBack
.

Listing 7.8

public static void GetQuoteCallBack(IAsyncResult ar)
{
object[] callBackState = (object[])ar.AsyncState; 
QuoteService qs = (QuoteService)callBackState[0];
 Form1 app = (Form1)callBackState[1];
Quote quote = qs.EndGetQuote(ar);
if(null == quote)
{
MessageBox.Show("No quote object received.");
return;
}

app.UpdateQuoteUI(quote);
}

XML Web service đã trả về cấu trúc dữ liệu khách hàng. .NET Compact Framework cung cấp khả năng truyền sự kiện nhiều dữ liệu phức tạp, giống như là

DataSet
. Mặc dù .NET Compact Framework không hỗ trợ kiểu
 DataSet
.

Gửi và nhận một DataSet thường xuyên được hoàn thành chính xác giống như là gửi cấu trúc dữ liệu hoặc những phẫn dữ liệu đơn giản, như là chuỗ. Phương thức Web đơn giản cần chấp nhận hoặc trả về đối tượng

System.Data.DataSet
. Trong khi tìm hiểu DataSet đầu tiên, chúng ta gửi hoàn thành một bảng
Quotes
tới client. Cho phép ứng dụng offline và đợi đến khi hiển thị trích dẫn đến khi người sử dụng bấm vào
GetQuote
.

Có một stored procedure trong CSDL

QuotableQuotes
gọi là
GetQuotes
, thủ tục này trả về tất cả thông tin trích dẫn trong bảng
Quotes.
Trở lại phần thiết kế XML Web service, và kéo thủ tục này vào trong phần thiết kế. Thay đổi tên câu lệnh này thành
cmdGetQuotes
. Chúng ta sẽ đưa ra phương thức Web
GetQuotes
trên
QuoteService
, phương thức này trả về một
DataSet
.

DataSet
sẽ được điền vào bằng cách sử dụng
SqlDataAdapter
chung với đối tượng SqlCommand
cmdGetQuotes
, mà chúng ta thêm vào đối tượng. Được má hóa như sau:
[WebMethod]
public DataSet GetQuotes()
{
quoteConnection.Open();
try
{
DataSet quotesDS = new DataSet();
SqlDataAdapter quotesDa = new SqlDataAdapter(this.cmdGetQuotes);
quotesDa.Fill(quotesDS);
return quotesDS;
}
finally
{
quoteConnection.Close();
}
}

Dịch và thử phương thức Web trong cách giống với phương thức

GetQuote
đã được thử.

Lần này kết quả sẽ trả về một trang dài XML tới trình đuyệt. XML đơn giản dưa ra XML từ

DataSet.WriteXml
. Bởi vì kiến trúc XML Web service tuần tự hóa một
DataSet
bằng cách gọi phương thức
DataSet.WriteXml
.

Bay giờ chúng ta tạo một ứng dụng client sử dụng

DataSet
từ Web service. Bắt đầu bằng cách tạo một Smart Device Application giống như cách tạo ứng dụng
QuotableQuotesClient
. Tạo ứng dụng có giao diện đồ họa và thêm đoạn mã sau vào lớp
Form1
:
private DataSet quotesDataSet;
    private int curQuoteRowNdx;
    

Bấm đúp vào nút Get Quotes sẽ đưa đến sự kiện click. Listing 7.9chứa mã nguồn.

Listing 7.9

private void btnQuote_Click(object sender, System.EventArgs e)
    {
     if(null == quotesDataSet)
      {
        
    QuoteService qs = new QuoteService();
    // Set the proxy's url property to the correct url of the server
quotesDataSet = qs.GetQuotes();
curQuoteRowNdx = 0;
    }
if( quotesDataSet.Tables.Count <= 0 )
{MessageBox.Show("Could not retreive the quotes dataset.");
    return;
    }
if(curQuoteRowNdx >= quotesDataSet.Tables[0].Rows.Count)
curQuoteRowNdx = 0;
DataRow quote = quotesDataSet.Tables[0].Rows[curQuoteRowNdx];
curQuoteRowNdx++;
UpdateQuoteUI(quote, 0);
}

Quotes

DataSet
được download từ dịch vụ web khi quotes
 DataSet
null
. Lần đâu tiên nút Get Quotes được bấm
DataSet
có giá trị null. Các lần sau được gọi thông tin trích dẫn được lưu trong quotes
DataSet
cục bộ , vì vậy không cần thiết download lại.

Nếu quotes

DataSet
có giá trị null, sau đó đối tượng
QuoteService
proxy được tạo, thuộc tính URL của proxy được cấu hình, và phương thức Web
GetQuotes 
được gọi.

Tương ứng với

DataRow
được nhận về từ
DataSet
UpdateQuoteUI
được gọi, cái này hiển thị thông tin trích dẫn tới ngườiu sử dụng.
UpdateQuoteUI
được thực thi để sử dụng một
DataRow 
thay cho cấu trúc thông tin trích dẫn. Có một tham số giá trị nguyên có tên
offset
kiểu
Int32
.

Listing 7.10 chứa đựng sự thực thi của phương thức

 UpdateQuoteUI
.

Listing 7.10

private void UpdateQuoteUI(DataRow quote, int offset)
{
lblQuote.Text = (string)quote[offset];
lblAuthor.Text = "-" + quote[offset + 1];
lblDate.Text = "Unknown" == (string)quote[offset + 2] ?
string.Empty : (string)quote[offset + 2];
}

Dịch và chạy ứng dụng. Ứng dụng sẽ hành động chính xác như nó đã làm trước, ngoại trừ trích dẫn sẽ lặp lại ngoại trừ hiển thị theo thứ tự không định trước.

.NET Compact Framework không hỗ trợ kiểu

DataSet
. Nếu Web service sử dụng kiểu
DataSet
, .NET Compact Framework clients sẽ không sử dụng được Web service. Đặc biệt, client sẽ bị lỗi khi cố gắng dịch proxy vào ứng dụng.

Có công việc xung quanh vấn đề sử dụng kiểu

DataSet
:

- Thay đổi XML Web service để sử dụng

DataSet
chuẩn.

- Thay đổi XML Web Service để đưa ra

DataSet
chuẩn.

- Tạo một XML Web service mới sử dụng kiểu DataSet nguyên bản và chuyển nó

DataSet 
chuẩn.

Có hai lựa chọn có thể dường như giống nhau, nhưng chúng khác nhau. Lựa chọn đề xuất là chúng ta loại bỏ toàn bộ tất cả thể hiện của kiểu

DataSet
từ Web service và sử dụng
DataSet 
chuẩn trong khi mã hóa. Đề xuất thứ hai chúng ta có thể thay đổi Web service để đưa ra (send/receive) chỉ
DataSet
chuẩn. Điều này có nghĩa là trong mã nguồn có thể tạo và sử dụng tiện ích kiểu
DataSet
, nhưng phương thức Web chỉ có thể sử dụng
DataSet
chuẩn như là tham số giá trị trả về.

Đơn giản là ghi ra một XML Web service để đưa ra

DataSet
chuẩn nhưng bên trong sử dụng kiểu
DataSet
. Trở lại đối tượng
QuoteableQuotes 
XML Web service, và phần thiết kế XML Web Service designer. Xác định bảng
Quotes
trong Server Explorer. Nó sẽ như sau đây:
<ServerName>SQLServers<ServerInstanceName>QuotableQuotesTables. 
    

Kéo bảng

Quotes
vào phần thiết kế. Nó tạo ra một
SqlDataAdapter
, để tạo một kiểu
DataSet
cho bảng
Quotes
. Đổi tên
SqlDataAdapter
thành
daQuotesDS
.

Bấm vào

SqlDataAdapter
, vào phần menu
Data
, và chọn mục Generate DataSet . . . Nó sẽ đưa đến hộp thoại Generate DataSet. Thay đổi tên của
DataSet
mới thành
QuotesDataSet
, và bấm OK. Nó sẽ sinh ra kiểu
DataSet
cho bảng
Quotes
.

Tạo một phương thức Web tên là

GetTypeQuotes
. Phương thức Web sẽ trả về
DataSet
chuẩn, nhưng bên trong nó sẽ sử dụng
QuotesDataSet
kiểu
DataSet
. Listing 7.11 chứa đựng một phương thức sẽ chuyển kiểu
DataSet
thành
DataSet
chuẩn trước khi trả về người sử dụng.

Listing 7.11

[WebMethod]
public DataSet GetTypedQuotes()
{
quoteConnection.Open(); 
try
{
QuotesDataSet quotesDS = new QuotesDataSet();
this.daQuotesDS.Fill(quotesDS);

return quotesDS;
}
finally
{quoteConnection.Close();
}
}

Để kết thúc ví dụ về Quotable Quotes DataSet client cần phải thay đổi để sử dụng phương thức

GetTypedQuotes
. Chỉ thao tác click của nút cần thiết phải thay đổi. Thao tác sẽ gọi
GetTypeQuotes
thay cho
GetQuotes
. Mặc dù, tham số
offset
của phương thức
UpdateQuoteUI
sẽ thay cho 1 thành 0 theo thứ tự bù cho cột ID trong
DataRow
. Listing 7.12 chứa đựng đoạn mã mới cho phương thức này.

Listing 7.12

private void btnQuote_Click(object sender, System.EventArgs e)
{
if(null == quotesDataSet)
{
QuoteService qs = new QuoteService();
// Set the proxy's url property to the correct url of the server
quotesDataSet =	qs.GetTypedQuotes();
curQuoteRowNdx = 0;
}
if(quotesDataSet.Tables.Count >= 0)
{
MessageBox.Show("Could not retreive the quotes dataset.");
    return;
    
}
if(curQuoteRowNdx >= quotesDataSet.Tables[0].Rows.Count)
curQuoteRowNdx = 0;
DataRow quote = quotesDataSet.Tables[0].Rows[curQuoteRowNdx];
    
curQuoteRowNdx++;
UpdateQuoteUI(quote, 1);
}

- .NET Compact Framework cung cấp khả năng cho ứng dụng sử XML Web services.

- .NET Compact Framework cung cấp khả năng cho sử dụng dữ liệu đơn giản, như là chuỗi, dữ liệu phức tạp, như là cấu trúc dữ liệu người dùng tự định nghĩa và DataSet.

- .NET Compact Framework hỗ trợ đồng bộ và không đồng bộ gọi XML Web service..

0