SOAP 和 Web Service 的基礎概念
SOAP - Simple Object Access Protocol
SOAP以XML形式提供一個簡單、輕量,在分散式環境中用來交換結構化和參數型別資訊的機制。SOAP只規範物件的存取範例,而不限制實際實作細節的技術環境,這意味著SOAP協定是一種跨技術平台的協定。
當用戶端試圖使用某個Web Service 方法時,需要向伺服器端發出一個HTTP要求,如以下範例
POST /WebService/TestWebService.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>
<Test xmlns="http://localhost:3974/">
<myParmeter>string</myParmeter>
</Test>
</soap12:Body>
</soap12:Envelope>
tag soap12:envelope 就是soap 協定所傳的資料。
而Web Service 伺服器端,接收到這樣的要求後,根據SOAP協定,HTTP回應以下的形式
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>
<TestResponse xmlns="http://localhost:3974/">
<TestResult>string</TestResult>
</TestResponse>
</soap12:Body>
</soap12:Envelope>
用戶端就得到了伺服器端的實際處理結果。
SOAP協定和HTTP協定的關係,非常類似於網路分層的上下層協定。 使用SOAP協定的雙方,都把SOAP封包放入HTTP內文中,並且透過HTTP協定完成實際的傳輸,如下圖:
Web Services
Web Services 將實作內容封裝,能夠與不同系統溝通,且允許使用者用servers作互動。 它透過Web 通訊協定及資料格式的開放式標準(例如 HTTP、XML 及 SOAP等)來為其他的應用程式提供服務。
以.NET來說,實作 Web 服務之類別的方法不會自動具備接收 Web 服務要求和傳回回應的能力,但是藉由使用 ASP.NET 所建立的 Web 服務,要新增這項功能就變得很簡單。
WSDL - Web Service Description Language
WSDL目的是為了描述Web Services所提供的服務,以供使用者參考。 WSDL 是一種符合XML與法規範的語言,它的設計完全基於SOAP協定。
在.NET Framework ,我們只要在web service 路徑後面 加上 "?WSDL" 就可以看到內建的 WSDL描述文件
http://localhost:3974/WebService/TestWebService.asmx?WSDL
以此Web Services Class為範例
/// <summary>
///TestWebService 的摘要描述
/// </summary>
[WebService(Namespace = "http://localhost:3974/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允許使用 ASP.NET AJAX 從指令碼呼叫此 Web 服務,請取消註解下列一行。
// [System.Web.Script.Services.ScriptService]
public class TestWebService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld(string parameter)
{
return "Hello World";
}
}
顯示文件內容
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://localhost:3974/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://localhost:3974/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://localhost:3974/">
<s:element name="HelloWorld">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="parameter" type="s:string" />
</s:sequence>
</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>
<wsdl:message name="HelloWorldSoapIn">
<wsdl:part name="parameters" element="tns:HelloWorld" />
</wsdl:message>
<wsdl:message name="HelloWorldSoapOut">
<wsdl:part name="parameters" element="tns:HelloWorldResponse" />
</wsdl:message>
<!----略---->
</wsdl:definitions>
主要訊息在 <wsdl:types> 節點底下
包含方法名稱、參數數量、每個參數的型別
<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:element name="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
以上為SOAP 與 Web Services 的關係,搞懂這部分花了蠻多時間的,不過我想對以後的開發一定會有很大的幫助。
參考:
https://msdn.microsoft.com/zh-tw/library/a7xexaft(v=vs.90).aspx
http://yes.nctu.edu.tw/Lecture/NewTech/C05/WebServices/Web%20Services%E4%BB%8B%E7%B4%B9.htm
http://www.tutorialspoint.com/webservices/what_are_web_services.htm
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。