Xét chuỗi sRequestXml có nội dung như sau: <?xml version="1.0" ?> <wfs:Transaction version="1.0.0" service="WFS" xmlns:cite="http://www.opengeospatial.net/cite" xmlns:ogc="http://www.opengis.net/ogc"
Chương 6. Cài đặt chương trình OpenGISServer xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance" xsi:schemaLocation="http://www.opengis.net/wfs ../wfs/1.0.0/WFS-transaction.xsd"> <wfs:Update typeName="duong"> <wfs:Property> <wfs:Name>NAME</wfs:Name> <wfs:Value>Ngô Gia Tự</wfs:Value> </wfs:Property> <ogc:Filter> <ogc:FeatureId fid="duong.3"/> </ogc:Filter> </wfs:Update> <wfs:Delete typeName=”quan”> <ogc:Filter> <ogc:FeatureId fid="quan.1"/> </ogc:Filter> </wfs:Delete> </wfs:Transaction>
Mỗi XmlNode sẽ tương ứng với 1 tag trong chuỗi Xml, chẳng hạn tag <wfs:Transaction> là 1 XmlNode.
Mỗi XmlNode có chứa nhiều XmlNode con, và có thể chứa các Attributes
của node đó.
Chẳng hạn, trong ví dụ trên thì node <wfs:Transaction> có 2 node con là <wfs:Update> và <wfs:Delete>. Node <wfs:Update> này chứa 2 node con là <wfs:Property> và <ogc:Filter>.
Chương 6. Cài đặt chương trình OpenGISServer
Đọc dữ liệu từ chuỗi Xml này.
Trước hết, cần phải tạo 1 XmlDocument tương ứng với chuỗi này: XmlDocument requestDocument = new XmlDocument();
requestDocument.LoadXml(sRequestXml); Lấy node đầu tiên <wfs:Transaction>:
XmlNode first = requestDocument.FirstNode; Lấy 2 node con <wfs:Update> và <wfs:Delete>: XmlNodeList childs = first.ChildNodes; XmlNode updateNode = childs[0];
XmlNode deleteNode = childs[1];
Lấy attribute “typeName” của node <wfs:Update>
string sUpdateTypeName = updateNode.Attributes[“typeName”]; Nếu như node không chứa attribute này thì hàm này trả về null.
Lấy giá trị của Node <wfs:Name>, sử dụng thuộc tính InnerXml của lớp XmlNode
string Name = updateNode.FirstChild.FirstChild.InnerXml;
Lấy tên của Node <wfs:Update>, có cả phần NameSpace phía trước tên node
string sNodeName = updateNode.Name;
Khi đó sNodeName = “wfs:Update”, trong đó “wfs” là NameSpace của Update”.
Lấy tên của Node <wfs:Update>, không lấy phần NameSpace phía trước tên node
string sLocalNodeName = updateNode.LocalName;
Chương 6. Cài đặt chương trình OpenGISServer
Để lấy chuỗi Xml tương ứng với Node <wfs:Update>: string xmlUpdate = updateNode.OuterXml;
Khi đó, chuỗi xmlUpdate sẽ có giá trị là: <wfs:Update typeName="duong"> <wfs:Property>
<wfs:Name>NAME</wfs:Name> <wfs:Value>Ngô Gia Tự</wfs:Value> </wfs:Property> <ogc:Filter> <ogc:FeatureId fid="duong.3"/> </ogc:Filter> </wfs:Update> 6.5. Các lớp trong chương trình Tên lớp Mô tả
Others/ExceptionBuilder Xây dựng chuỗi XML dùng để báo
các lỗi về cho client khi có lỗi trong request
Other/OtherTasks Chứa tên các FeatureType trong
chương trình Chức các thuộc tính của các FeatureType Chứa các hàm thực hiện những tác vụ phụ trong chương trình WFS/CheckBasicParameterClasses/Abstra ctHTTPClass Lớp trừu tượng, có tác dụng lấy các tham số mà client gửi lên trong request.
Chương 6. Cài đặt chương trình OpenGISServer WFS/CheckBasicParameterClasses/HTTP GetClass Kế thừa từ lớp CheckBasicParameterClasses/Abstrac tHTTPClass, có tác dụng lấy các tham số mà client gửi lên trong 1 HTTP GET request WFS/CheckBasicParameterClasses/HTTP PostClass Kế thừa từ lớp CheckBasicParameterClasses/Abstrac tHTTPClass, có tác dụng lấy các tham số mà client gửi lên trong 1 HTTP POST request
WFS/FeatureClass/AbstractFeature Là 1 lớp abstract, gồm các hàm dùng
để thực hiện các tác vụ liên quan đến
các FeatureType trên Server, chẳng
hạn như:
Đọc từ cơ sở dữ liệu để lấy về các Feature thỏa 1 sốđiều kiện nào đó Tạo ra chuỗi Xml mô tả các Feature để trả về cho client (chức năng này được cài đặt cụ thểở các lớp con của nó).
Lấy các thuộc tính của Feature ……
Chương 6. Cài đặt chương trình OpenGISServer
WFS/FeatureClass/DistrictFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên loại Feature “Quan”:
Lấy các thuộc tính của loại Feature “Quan”.
Tạo chuỗi Xml mô tả với các Feature “Quan” lấy được từ cơ sở dữ liệu để trả về cho client
WFS/FeatureClass/PlaceFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “nơi chốn”
Lấy các thuộc tính của loại Feature “noi chon”.
Tạo chuỗi Xml mô tả với các Feature “noi chon” lấy được từ cơ sở dữ liệu để trả về cho client
WFS/FeatureClass/RiverFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “Song”
Lấy các thuộc tính của loại Feature “Song”.
Tạo chuỗi Xml mô tả với các Feature “Song” lấy từ csdl trả về cho client.
Chương 6. Cài đặt chương trình OpenGISServer
WFS/FeatureClass/RoadFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “Duong”
Lấy các thuộc tính của loại Feature “Duong”.
Tạo chuỗi Xml mô tả với các Feature “Duong” lấy được từ cơ sở dữ liệu để trả về cho client WFS/FeatureClass/UniversityEnrollmentF eature Kế thừa từ lớp WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “UBNDQuan”
Lấy các thuộc tính của loại Feature “UBNDQuan”.
Tạo chuỗi Xml mô tả với các Feature “UBNDQuan” lấy được từ cơ sở dữ liệu để trả về cho client
WFS/FeatureClass/YPageSitFeature Kế thừa từ lớp
WFS/FeatureClass/AbstractFeature. Có chức năng thực hiện các thao tác trên các Feature thuộc loại Feature “YPageSit”
Lấy các thuộc tính của loại Feature “YPageSit”.
Tạo chuỗi Xml mô tả với các Feature “YPageSit” lấy từ csdl trả về client.
Chương 6. Cài đặt chương trình OpenGISServer
WFS/FilterClasses/FilterSolution Có chức năng tạo ra chuỗi query dùng
để truy vấn cơ sở dữ liệu từđối tượng XmlDocument mô tả chuỗi Filter. WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Get ParameterClasses/AbstractHttp Là 1 lớp ảo, có tác dụng lấy các tham số của DescribeFeatureType request . WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Get ParameterClasses/HttpGetRequest Là lớp con của lớp WFS/WFS OperationClasses/DescribeFeatureTyp eSolution/GetParameterClasses/Abstr actHttp. Có tác dụng lấy các tham số của
DescribeFeatureType request được gởi lên bằng giao thức HTTP GET. WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Get ParameterClasses/HttpPostRequest Là lớp con của lớp WFS/WFS OperationClasses/DescribeFeatureTyp eSolution/GetParameterClasses/Abstr actHttp. Có tác dụng lấy các tham số của
DescribeFeatureType request được gởi lên bằng giao thức HTTP POST. WFS/WFS Operation Classes/DescribeFeatureTypeSolution/Des cribeFeatureTypeSolution Có chức năng nhận 1 DescribeFeatureType request, lấy về mô tả của các loại Feature và tạo chuỗi response bằng Xml. WFS/WFS Operation Classes/GetFeatureSolution/GetParameter Classes/AbstractHttp Là 1 lớp ảo, có tác dụng lấy các tham số của GetFeature request . WFS/WFS Operation Classes/GetFeatureSolution/GetParameter Là lớp con của lớp WFS/WFS OperationClasses/GetFeatureSolution/
Chương 6. Cài đặt chương trình OpenGISServer
Classes/HttpGetRequest GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của
GetFeature request được gởi lên
bằng giao thức HTTP GET. WFS/WFS Operation Classes/GetFeatureSolution/GetParameter Classes/HttpPostRequest Là lớp con của lớp WFS/WFS OperationClasses/GetFeatureSolution/ GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của
GetFeature request được gởi lên
bằng giao thức HTTP POST. WFS/WFS Operation Classes/GetFeatureSolution/GetFeatureSo lution Có chức năng nhận 1 GetFeature request, truy vấn cơ sở dữ liệu để lấy về các Feature được yêu cầu và tạo chuỗi response bằng Xml. WFS/WFS Operation Classes/LockFeatureSolution/GetParamet erClasses/AbstractHttp Là 1 lớp ảo, có tác dụng lấy các tham số của LockFeature request . WFS/WFS Operation Classes/LockFeatureSolution/GetParamet erClasses/HttpGetRequest Là lớp con của lớp WFS/WFS OperationClasses/LockFeatureSolutio n/GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của
LockFeature request được gởi lên
bằng giao thức HTTP GET. WFS/WFS Operation Classes/LockFeatureSolution/GetParamet erClasses/HttpPostRequest Là lớp con của lớp WFS/WFS OperationClasses/LockFeatureSolutio n/GetParameterClasses/AbstractHttp. Có tác dụng lấy các tham số của
LockFeature request được gởi lên
Chương 6. Cài đặt chương trình OpenGISServer
WFS/WFS Operation
Classes/LockFeatureSolution/LockFeature Solution
Có chức năng nhận 1 LockFeature
request, khóa các Feature theo yêu cầu và tạo chuỗi response bằng Xml. WFS/WFS Operation
Classes/LockFeatureSolution/DataBaseAc cess
Gồm các hàm thực hiện các thao tác trên cơ sở dữ liệu liên quan tới chức năng khóa và mở khóa các Feature. WFS/WFS Operation
Classes/TransactionSolution/OperationSol ution/HTTPGETDelete
Có chức năng nhận Transaction request với Operation là Delete, được gởi lên bằng giao thức HTTP GET, thực hiện xóa các Feature theo yêu cầu và tạo response tương ứng. WFS/WFS Operation
Classes/TransactionSolution/OperationSol ution/HTTPPOSTDelete
Có chức năng nhận Transaction request với Operation là Delete, được gởi lên bằng HTTP POST, thực hiện xóa các Feature theo yêu cầu và tạo response tương ứng
WFS/WFS Operation
Classes/TransactionSolution/OperationSol ution/HTTPPOSTUpdate
Có chức năng nhận Transaction request với Operation là Update,
được gởi lên bằng HTTP POST, thực hiện việc cập nhật các Feature theo yêu cầu và tạo response tương ứng WFS/WFS Operation
Classes/TransactionSolution/OperationSol ution/HTTPPOSTInsert
Có chức năng nhận Transaction request với Operation là Insert, được gởi lên bằng HTTP POST, thực hiện việc thêm các Feature theo yêu cầu và tạo response tương ứng. WFS/WFS Operation Classes/TransactionSolution/DataBaseAcc ess Gồm các hàm dùng để thao tác trên cơ sở dữ liệu. Thực hiện thêm, xóa, sửa các bảng trong csdl theo yêu cầu.
Chương 6. Cài đặt chương trình OpenGISServer
WFS/WFS Operation
Classes/TransactionSolution/TransactionS olution
Có chức năng nhận 1 Transaction request, thực hiện yêu cầu transaction tương ứng và trả về chuỗi response bằng Xml.
WFS/WFS Operation
Classes/GetCapabilitiesSolution
Có chức năng nhận 1 GetCapabilities request, lấy thông tin về các khả năng của server và trả về chuỗi response bằng Xml. WFS/WFS Operation Classes/FeatureRequest Chứa 1 loại Feature cần truy vấn và các điều kiện truy vấn đối với lớp đó. WFS/WFSSolution Nhận 1 WFS request, xác định loại request cụ thể và gọi lớp tương ứng để thực hiện request này Bảng 6.8.Các lớp trong chương trình
Chương trình có 1 trang ASP.NET ởđịa chỉ
http://localhost/OpenGISServer/VNesOpenGISServer.aspx
Trang này sẽ trực tiếp nhận các request từ client, thực hiện 1 số kiểm tra đểđảm bảo tính hợp lệ của request, xác định loại request là WFS hay WMS và gọi lớp tương ứng để đáp ứng request.
Các file Xml lưu trữ các thông tin về server.
File XmlFiles/WFS_Capabilities.xml: File này chứa nội dung của tài liệu
Xml dùng làm response cho request GetCapabilities.
File XmlFiles/ExceptionFrame.xml: File này chứa phần khung nội dung
của chuỗi Xml dùng làm response khi request có lỗi.
Các file trong thư mục WFS/FeatureTypeFiles: đây là các file chứa các tài liệu xml dùng để mô tả các loại Feature. Các file này hỗ trợ cho response của DescribeFeatureType request
Chương 7. Cài đặt các chương trình client
Chương 7. Cài đặt các chương trình client 7.1. Cài đặt chương trình OpenGisClientDemo
7.1.1. Giới thiệu
7.1.1.1.Tính năng
Chương trình OpenGISClient là 1 chương trình được cài đặt bằng C# ở dạng Window Form.
Chức năng của chương trình là minh họa 1 cách cụ thể, rõ ràng việc thực
hiện các request WFS và WMS lên các server hỗ trợ WFS và WMS.
Chương trình lưu 1 danh sách các server hỗ trợ WFS và WMS, có thể thêm
các server mới. Trong quá trình thực hiện request, ta có thể chọn bất kì server nào để gởi request và nhận kết quả từ server đó.
Các request mà OpenGISClient hỗ trợ gồm: WFS: • GetCapabilities • DescribeFeatureType • GetFeature • LockFeature • Transaction WMS: • GetCapabilities • GetMap
Chương trình sử dụng bộ thư viện CarbonTools. Bộ thư viện này hỗ trợ thực hiện request.
Chương 7. Cài đặt các chương trình client
7.1.1.2.Màn hình giao diện
7.1.1.2.1. Màn hình chính
Chương 7. Cài đặt các chương trình client
7.1.1.2.2. Màn hình minh họa thực hiện request WFS - GetCapabilities
Chương 7. Cài đặt các chương trình client
7.1.1.2.3. Màn hình minh họa thực hiện request WFS – DescribeFeatureType.
Chương 7. Cài đặt các chương trình client
7.1.1.2.4. Màn hình minh họa thực hiện request WFS – GetFeature
Chương 7. Cài đặt các chương trình client
7.1.1.2.5. Màn hình minh họa thực hiện request WFS – GetFeature
Chương 7. Cài đặt các chương trình client
7.1.1.2.6. Màn hình minh họa thực hiện request WFS – Transaction
Chương 7. Cài đặt các chương trình client
7.1.1.2.7. Màn hình minh họa thực hiện request WMS – GetCapabilities
Chương 7. Cài đặt các chương trình client
7.1.1.2.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
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 =
Chương 7. Cài đặt các chương trình client
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.
Chương 7. Cài đặt các chương trình client
• 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 =
Chương 7. Cài đặt các chương trình client
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 Streamchứ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