What are web services

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

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。