
Chương 7. Cài đặt các chương trình client
134
7.1.1.2.8. Màn hình minh họa thực hiện request WMS – GetMap
Hình 7.8.Màn hình minh họa thực hiện request WMS – GetMap

Chương 7. Cài đặt các chương trình client
135
7.1.2. Gởi request cho server
Sau khi xây dựng xong chuỗi request bằng Xml, ta cần phải gởi chuỗi
request này lên cho server.
Trong .NET, ta có thể thực hiện việc gởi 1 request lên cho server theo 2 cách
là: đồng bộ và bất đồng bộ
7.1.2.1. Thực hiện việc gởi request bằng phương pháp đồng bộ
Đối với phương pháp đồng bộ, sau khi thực hiện 1 request thì client phải chờ
cho đến khi nhận xong response từ server, nó mới có thể thực hiện tiếp các
tác vụ khác. Do đó, trong lúc nhận response từ server thì client không thể
làm được việc gì khác.
Để gởi request bằng phương pháp đồng bộ, ta sử dụng 2 lớp là
HttpWebRequest và HttpWebResponse.
7.1.2.1.1. Gởi request bằng phương pháp dồng bộ với giao thức HTTP GET
Trong trường hợp này chuỗi URL có thể chứa thêm các thông tin khác.
Ví dụ dưới đây gởi request đến 1 server có chuỗi URL là
string sURL =
“http://localhost/OpenGISServer/VNesOpenGISServer.aspx?SERVIC
E=WFS&
VERSION=1.0.0&REQUEST=GetFeature&TypeName=buudien,quan,duong”
Chuỗi URL này có thêm các tham số là SERVICE, VERSION,
REQUEST, TypeName.
Tạo đối tượng HttpWebRequest và gởi chuỗi URL
System.Net.HttpWebRequest httpRequest =
System.Net.HttpWebRequest)System.Net.WebRequest.Create(sURL);

Chương 7. Cài đặt các chương trình client
136
Nhận kết quả trả về dưới dạng 1 stream.
System.Net.WebResponse httpResponse =
httpRequest.GetResponse();
System.IO.Stream stream = httpResponse.GetResponseStream();
Sau khi nhận dòng dữ liệu này, ta có thể lấy dữ liệu trong dòng dữ liệu
dưới dạng chuỗi hoặc lưu dòng dữ liệu xuống file.
StreamReader reader = new StreamReader(stream);
Chuyển kết quả sang 1 chuỗi.
string response = reader.ReadToEnd();
Lưu dòng dữ liệu xuống file.
FileStream file = new
FileStream("c:\\xml.xml",FileMode.Create,FileAccess.Write);
int ch;
do{
ch = stream.ReadByte();
if (ch!= -1)
file.WriteByte((byte)ch);
}while (ch != -1);
file.Close();
7.1.2.1.2. Gởi request bằng phương pháp đồng bộ với giao thức HTTP POST
Trong trường hợp này nội dung cần gởi lên server được lưu trong phần body
của request.
Ví dụ dưới đây gởi 1 request dưới dạng POST lên server.
Server có địa chỉ là
sAddress=http://localhost/OpenGISServer/VNesOpenGISServer.aspx
Nội dung cần gởi lên server này được lưu trong chuỗi sPostContent.
Khi đó việc gởi request và nhận response được thực hiện như sau:

Chương 7. Cài đặt các chương trình client
137
• Tạo đối tượng HttpWebRequest và ghi nội dung của chuỗi sPostContent
vào phần body của request.
System.Net.HttpWebRequest myHttpWebRequest =
(System.Net.HttpWebRequest)System.Net.WebRequest.Creat
e(sAddress);
System.Text.ASCIIEncoding encoding=new
System.Text.ASCIIEncoding();
byte[] byte1=encoding.GetBytes(sPostContent);
//Chọn loại ContentType của dữ liệu cần gởi lên
myHttpWebRequest.ContentType="application/x-www-form-
urlencoded";
// Xác định chiều dài của chuỗi cần gởi lên
myHttpWebRequest.ContentLength=sPostContent.Text.
Length;
myHttpWebRequest.Method = "POST";
Stream newStream = myHttpWebRequest.GetRequestStream();
newStream.Write(byte1,0,byte1.Length);
newStream.Close();
System.Net.WebResponse httpResponse =
myHttpWebRequest.GetResponse();
System.IO.Stream stream =
httpResponse.GetResponseStream();
StreamReader reader = new StreamReader(stream);
//Chuyển kết quả sang 1 chuỗi.
string response = reader.ReadToEnd();
stream.Close();
httpResponse.Close();
//Lấy kết quả trả về.
System.Net.WebResponse httpResponse =
httpRequest.GetResponse();
System.IO.Stream stream =
httpResponse.GetResponseStream();

Chương 7. Cài đặt các chương trình client
138
7.1.2.2. Gởi request bằng phương pháp không đồng bộ
Khi gởi 1 request bằng phương pháp không đồng bộ, ta có thể tiếp tục thực
hiện các tác vụ khác trong lúc nhận kết quả trả về bởi vì tác vụ nhận kết quả
từ server sẽ được thực hiện trong 1 tiểu trình khác.
7.1.2.2.1. Gởi request bằng phương pháp không đồng bộ với giao thức HTTP GET
Ví dụ dưới đây minh họa việc gởi request đến server bằng phương pháp
không đồng bộ với giao thức HTTP GET.
Chương trình dưới đây là 1 chương trình dưới dạng console, có chức năng
nhận 1 chuỗi URI từ dòng lệnh, yêu cầu tài nguyên từ địa chỉ đó, in dữ liệu ra
màn hình sau khi nó nhận xong dữ liệu từ server.
Chương trình định nghĩa 2 lớp là lớp RequestState, có tác dụng chuyển dữ
liệu qua lại giữa các các lời gọi không đồng bộ và lớp ClientGetAsync dùng
để tạo 1 request bằng phương pháp không đồng bộ
• Lớp RequestState lưu trạng thái của request trong suốt quá trình gọi
các hàm để phục vụ request. Nó chứa 1 đối tượng WebRequest và 1 đối
tượng Stream, đối tượng WebRequest chứa request hiện tại đến tài
nguyên trên server và đối tượng Stream chứa dòng dữ liệu nhận được từ
response của server, và 1 đối tuợng StreamBuilder chứa toàn bộ chuỗi
response. Một đối tượng RequestState được dùng làm tham số state khi
hàm AsyncCallback được đăng kí với
hàmWebRequest.BeginGetResponse.
• Lớp ClientGetAsync chứa các hàm và các thuộc tính dưới đây:
o Thuộc tính allDone chứa 1 đối tượng của lớp ManualResetEvent,
dùng để báo hiệu khi request hoàn thành.
o Hàm Main() đọc thông tin từ dòng lệnh và tạo 1 request đến 1 tài
nguyên trên internet. Nó tạo 1 đối tuợng WebRequest wreq và đối
tượng RequestState rs, gọi hàm BeginGetResponse để bắt đầu quá

