WebService – Cơ bản về SOAP, WSDL và ASP.NET Web Service

Web Serivce là một công nghệ cho phép client truy xuất để thực hiện mọi tác vụ như một Web Application. Về bản chất, Web service dựa trên XML và HTTP, trong đó XML làm nhiệm vụ mã hóa và giải mã dữ liệu và dùng SOAP để truyền tải. Web Service không phụ thuộc vào platform nào, do đó bạn có thể dùng Web Service để truyền tải dữ liệu giữa các ứng dụng hay giữa các platform.


Sơ đồ tương tác giữa User và Web Service:

 

SOAP – Simple Object Access Protocol

SOAP – Một tiêu chuẩn của W3C,  là giao thức sử dụng XML để định nghĩa dữ liệu dạng thuần văn bản (plain text) thông qua HTTP. SOAP là cách mà  Web Service sử dụng để truyền tải dữ liệu. Vì dựa trên XML nên SOAP là một giao thức không phụ thuộc platform cũng như bất kì ngôn ngữ lập trình nào.

Một thông điệp SOAP được chia thành hai phần là header và body. Phần header chỉ ra địa chỉ Web Service, host, Content-Type, Content-Length tương tự như một thông điệp HTTP.

Khi tạo một dự án Web Service, mặc định Web Visual Develop sẽ tạo cho bạn phương thức HelloWorld() sau:

public string HelloWorld()
{
    return "Hello World";
}

Một HTTP Request sẽ có dạng sau:

POST /MathService.asmx/HelloWorld HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: length

 

Đối với SOAP (v1.2)

-Request:

POST /MathService.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <HelloWorld xmlns="http://tempuri.org/" />
  </soap12:Body>
</soap12:Envelope>

Trong phần <soap12:Body> của đoạn SOAP request trên, thẻ <HelloWorld xmlns=”http://tempuri.org/&#8221; /> được dùng để các phần tử con tương ứng với các dữ liệu mà phương thức HelloWorld yêu cầu để làm tham số. Bởi vì phương thức HelloWorld không yêu cầu bất kì tham số nào, nên thẻ này cũng không có bất kì phần tử con nào.

-Response:

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <HelloWorldResponse xmlns="http://tempuri.org/">
      <HelloWorldResult>string</HelloWorldResult>
    </HelloWorldResponse>
  </soap12:Body>
</soap12:Envelope>

Phương thức HelloWorld() của WebService trả về dữ liệu có dạng string, và bạn có thể thấy rõ điều này trong thẻ <soap12:Body>.

Nếu cần tìm hiểu thêm về SOAP, bạn có thể tham khảo các bài hướng dẫn trên W3schools:

http://www.w3schools.com/soap/default.asp

 

WSDL – Web Services Description Language

WSDL là ngôn ngữ được sử dụng để mô tả đầy đủ về Web Service theo chuẩn XML như các phương thức, kiểu dữ liệu,… dựa trên XML schema.

Ví dụ một đoạn định nghĩa kiểu dữ liệu của WSDL cho phương thức HelloWorld() trên:

[…]
<wsdl:types>
	<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
		<s:element name="HelloWorld">
			<s:complexType />
		</s:element>
		<s:element name="HelloWorldResponse">
			<s:complexType>
				<s:sequence>
					<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
				</s:sequence>
			</s:complexType>
		</s:element>
	</s:schema>
</wsdl:types>
[…]

Trong đó, phần định nghĩa các kiểu dữ liệu dùng cho request được đặt tên dựa theo tên phương thức “HelloWorld”:

<s:element name="HelloWorld">
	<s:complexType />
</s:element>

Theo sau đó là phần định nghĩa các kiểu dữ liệu dùng để response được đặt tên “HelloWorldResponse”:

<s:element name="HelloWorldResponse">
	<s:complexType>
		<s:sequence>
			<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
		</s:sequence>
	</s:complexType>
</s:element>

Việc đặt tên này cần thiết để sử dụng trong phần định nghĩa message phía sau. Tham khảo hướng dẫn về XML Schema và WSDL tại các link sau:

http://www.w3schools.com/wsdl/default.asp

http://www.w3schools.com/schema/

Tạo một ASP.NET Web Service đơn giản

Trong .Net, bạn tạo ra một Web Service ra bằng cách tạo một subclass của lớp System.Web.Services.WebService, sau đó định nghĩa các phương thức có thể được triệu gọi từ client. Các phương thức này phải được đánh dấu với attribute [WebMethod].

Khi tạo một dự án mới, nếu bạn đặt phiên bản .Net sử dụng là 4, template Web Service sẽ không tồn tại do Microsoft nghĩ rằng template đó quá đơn giản. Vì vậy muốn tạo một project Web Service, bạn phải chuyển phiên bản .Net sang 3.5 . Ở đây tôi vẫn sử dụng phiên bản .Net 4 và tạo một project ASP.NET Empty Web Application với tên là Y2FirstWebService.

Tiếp đó bạn thêm item Web Service (phím tắt Ctrl + Shift + A để mở cửa sổ Add New Item) với tên là HelloService.asmx.

File code-behind HelloService.asmx.cs khi được tạo ra đã chứa sẵn phương thức HelloWorld().

HelloService.asmx:

<%@ WebService Language=”C#” CodeBehind=”HelloService.asmx.cs” %>

HelloService.asmx.cs (v1):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace Y2FirstWebService
{
    /// <summary>
    /// Summary description for MathService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    // [System.Web.Script.Services.ScriptService]
    public class HelloService : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

Bạn có thể nhấn F5 chạy thử, trình duyệt sẽ mở ra và hiển thị đường link với nội dung HelloWorld. Đây chính là tên của phương thức của lớp HelloService trên. Nhấn vào link này, bạn được đưa đến một trang dùng để test phương thức HelloWorld.

Note: Bạn có thể xem nội dung WSDL được tạo ra để mô tả cho Web Service này bằng cách bằng cách nhấn vào link Service Description với địa chỉ có dạng (chạy trên localhost, port của bạn có thể khác): http://localhost:1107/MathService.asmx?WSDL.

Bên dưới bạn có thể thấy thông điệp SOAP request và response sẽ được sử dụng để giao tiếp giữa client với Web Service.

Nhấn nút Invoke, trình duyệt sẽ mở ra một trang mới với nội dung theo định dạng XML, kết quả thực sự trả về của phương thức là nội dung nằm trong thẻ <string>:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<string xmlns=”http://tempuri.org/“>Hello World</string>

Bây giờ ta thêm một phương thức mới với tên Hello, đồng thời tạo thêm class Person để làm kiểu trả về cho phương thức Hello() này.

HelloService.asmx.cs (v2):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace Y2FirstWebService
{
    /// <summary>
    /// Summary description for MathService
    /// </summary>
    // [WebService(Namespace = "http://tempuri.org/")]
    // [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    // [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    // [System.Web.Script.Services.ScriptService]
    public class HelloService : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public Person Hello(string name, int age)
        {
            return new Person { Name = name, Age = age };
        }
    }
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

Chạy lại Web Service và kiểm tra phương thức Hello(), giao diện trang web sẽ thay đổi cho phép bạn nhập tham số vào:

Nhập tên vào textbox và nhấn Invoke, trình duyệt sẽ mở ra trang kết quả:

<?xml version="1.0" encoding="utf-8" ?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <Name>Yin Yang</Name>
<Age>10</Age>
</Person>

Như bạn thấy dữ liệu trả về của phương thức Hello là một đối tượng kiểu Person có hai property Name và Age. Đối tượng này sẽ được mã hóa thành XML thành nội dung mà bạn thấy ở trên với tên các thẻ khớp với tên class, property mà ta khai báo.

Phần kết

Vậy là bạn đã tạo được một Web Service, và như bạn có thể thấy, công việc thật đơn giản. Tuy nhiên bạn vẫn chưa biết cách áp dụng Web Service vào một vấn đề cụ thể, cũng như chưa biết cách sử dụng Web Service như thế nào. Nếu bạn quan tâm đến đề tài này, vui lòng đón xem các phần sau. Tôi sẽ trình bày chi tiết hơn về Web Service cũng như cách tạo các ứng dụng client để truy xuất Web Service.

32 thoughts on “WebService – Cơ bản về SOAP, WSDL và ASP.NET Web Service

    • Tạo bảng dữ liệu Category(IDC ,CategoryName) và Product(IDpro ,ProName ,Price ,ImgUrl ,Description, Idcategory). Một category sẽ có nhiều product. Viết một WCF service cho phép thực hiện các chức năng: thêm ,xóa ,sửa, hiển thị, tìm kiếm cho Category, product. Viết trang webclient cho phép hiển thị category và danh sách các product thuộc tất cả category, khi client click váo category bất kỳ sẽ liệt kê những product thuộc category đó, click chọn 1product sẽ xem được chi tiết product. Phần admin của webclient bao gồm trang quản lý category với các chức năng thêm, xóa, sửa, hiển thị, tìm kiếm, trang quản lý product cũng có các chức năng như quản lý category. Lưu ý admin không cần phải viết trang login, các chức năng trên client phải được gọi thông qua WCF service.
      Có bài này mình không hiểu lắm
      bạn có thể giúp mình được không

      Trả lời
  1. Web Service chỉ được host trên IIS, còn WCF Services có thể được host trên bất kỳ ứng dụng .NET nào, đó là một trong những lý do tại sao chúng ta nên xài WCF Services. Tất nhiên, có những loại services cần dùng các tính năng của IIS, nên chúng ta không thể không sử dụng IIS. Và trên tất cả thì, WCF là con tim của các ứng dụng .NET (theo định hướng của Microsoft), bởi MS muốn mọi thứ đều hướng dịch vụ, giảm nhẹ sức nặng cho PC và tăng cường sự hiện diện của cloud, và nhờ đó mà những OS như Windows, WP sẽ chạy nhẹ nhàng và thoải mái hơn, nhường phần nặng nề cho máy chủ cloud của MS.

    Điều được của chúng ta là khi đã deploy db và services lên cloud, chúng ta chả cần lo lắng gì nhiều nữa. Điều mất là chúng ta mất nhiều tiền hơn một chút. Và một điều cần băn khoăn đó là, dù biết rằng MS bảo mật dữ liệu tốt hơn chúng ta làm rất nhiều, nhưng liệu chúng ta có yên tâm? Cái cảm giác này chắc giống mấy bà thím hồi xưa mới chập chững đi gởi tiền ở ngân hàng.^^

    Trả lời
    • Em thấy có 1 điểm lạ, là khi dùng WCF gởi dữ liệu về client: Trên Server, em dùng Entity Framework (Database First) để tạo ra Model, và gởi trả về client List thì dữ liệu trả về rất lớn (hơn 6 Mb), còn nếu em tạo 1 class Customer và ánh xạ các thuộc tính qua (các properties chính, không bao gồm navigation properties), thì dữ liệu chuyển về khoảng 14 kb.

      Trả lời
      • Cái đó đơn giản và dễ hiểu thôi, em nên biết rõ DataContract là thứ ta cần gởi về, thì ta nên dùng POCO (Plan Old CLR Object) và chỉ quy định đúng thứ cần gởi về. Data Entity Model không phải để dùng cho WCF Service. Cho dù em có tạo model bằng Code First, em cũng không nên dùng nó làm DataContract. Nghĩa là em nên tuân thủ theo nguyên tắc là mỗi thứ chỉ nên có một vai trò thôi, tức là Single Responsibility. Tuy nhiên anh nghĩ em có chút nhầm lẫn nho nhỏ, đó là chỉ thuộc tính nào có [DataMember] thì nó mới được gởi về client. ^^

  2. Cho mình hỏi một chút thế này : Khi dùng webservices, mình truyền SOAP message tới server,xử lý rất ngon. Nhưng khi chuyển qua wcf, mình host 1 cái wcf trên console. Nhưng khi truyền soap message lên thì server không xử lý được.

    Có thể chia sẻ cách làm bằng soap message truyền lên 1 ứng dụng WCF được ko ạ ?

    Trả lời
    • bạn cho minh hỏi soap message viết trên phần mềm nào.minh mới học tại chức kho công nghệ thông tin.thầy bắt vieeci ứng dụng Tìm hiểu về SOAP và xây dựng phần mềm mô phỏng.mà ko biết bắt đầu từ đâu.mong các bác giúp đỡ

      Trả lời
  3. Pingback: WebService – Cơ bản về SOAP, WSDL và ASP.NET Web Service « VinhTC

  4. ví dụ ở phía server e sẽ tạo 1 hàm getallemployee(), trong silverlight gọi theo cơ chế bất đồng bộ nên phía client sẽ gọi webservice bằng phương thức getallemployeeAsync() và sự kiện getallemployeeCompleted.Mình sẽ bắt sự kiện này để handle khi nào dữ liệu được load xong.Vậy thì nên gọi hàm Async trước hay sau khi bắt sự kiện Completed? em đã thử thì gọi trước hay sau gì thì kết quả cũng ra giống nhau, nhưng vì cơ chế của nó là bất đồng bộ nên em sợ khi dùng thêm nhiều hàm khác bất đồng bộ như vậy thì có thể bị ảnh hưởng. Em cũng có 1 câu hỏi về vấn đề NotifyPropertyChanged bên silverlight mà hình như ở đây k có box silverlight nên em sẽ qua wpf để e hỏi nha

    Trả lời
    • Nguyên tắc là: một event nên được tạo ra trước khi bạn gọi method để đảm bảo event đó tồn tại khi method cần đến nó. Trường hợp bạn gọi method sau đó tạo handle event ngay thì vẫn có thể hoạt động bình thường nhưng nó sẽ thiếu chặt chẽ và không hợp lý.

      Trả lời
  5. Mấy bác cho em hỏi em đang làm đề tài truyền dữ liệu từ xa qua internet giữa máy tinh va android…..Vậy em có thể dùng WEb service hay WCF service làm ccaauf nối trung gian đc không.? và cách đưa web service hay WCF lên internet để aivao internet có thể truy cập đc

    Thank!

    Trả lời
  6. Em chào anh ạ. Tìm kiếm mãi mới thấy trang web của anh. Bài viết tuyệt quá. Thank anh :))
    Sao anh không viết tiếp về chủ đề như thế này ạ
    Anh ơi nếu em muốn hiển thị cả hình ảnh và video được lưu trong webservice asp.net thông qua ksoap2 thì có được không ạ. Anh giúp em với ạ. Em cảm ơn anh rất nhiều ạ

    Trả lời
  7. Em chào anh, em đang tìm hiểu về web service thì vô tình tìm thấy bài của anh rất hay.
    Em đang muốn xây dựng một hệ thống gồm 2 phần, user sẽ upload ảnh lên server, khi server nhận được ảnh sẽ gọi một chương trình viết bằng C++ để xử lý ảnh vừa up lên sau đó trả về các thông số sau khi xử lý thì anh có giải pháp nào cho vấn đề này ko ạ? Em loay hoay mãi mà chưa tìm ra. Anh giúp em với, cảm ơn anh nhiều! 🙂

    Trả lời
  8. Pingback: WebService – Cơ bản về SOAP, WSDL và ASP.NET Web Service | fistgold192

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s