WebService工作原理

2021-06-25 07:01:58 字數 3614 閱讀 9551

webservice主要採用了http協議,http是個基於tcp/ip的應用層協議:(注:現在的大部分webservice開發已經能很好的支援socket的實時通訊了.但http依然是它的精髓.)

http採用了"請求-----應答"模式;

http通訊是通過xml序列化通訊的......

http通訊過程:呼叫.asmx

控制代碼,xml

、xsd

、soap

和wsdl處理,

xml中主要提供的有三方面:(下面文章引自:

)個人感覺主要要掌握的是soap請求訊息和應答訊息的xml格式...

當.asmx控制代碼被http管道呼叫時,通過檢視.asmx檔案中的webservice宣告,確定檢查哪個.net類。然後它觀察到來的http訊息中的資訊,確定呼叫引用類中的哪個方法。為了呼叫前面例子中的add方法,http請求訊息應像下面一樣:

上面的http請求訊息中有兩條資訊可以用來確定呼叫類中的哪個方法:soapaction頭或soap體中請求元素的名字。在這個例子中,每種方法都指出了傳送者想呼叫的方法名。

.asmx控制代碼使用soapaction頭的值來實現訊息的分派。因此,.asmx控制代碼檢視訊息中的soapaction頭,使用.net對映檢查引用類中的方法。它只考慮標記了[webmethod]屬性的方法,但通過檢視每種方法的soapaction值再具體確定呼叫哪個方法。因為我們在類中並沒有明確的指定soapaction的值,.asmx控制代碼認為soapaction的值是web服務的命名空間加上方法名。而且我們也沒有指定命名空間,所以控制代碼就把作為預設值。這樣add方法的預設soapaction值就是/add。

可以按如下方法定製web服務的命名空間。把類標記上[webservice]屬性,用[soapdocumentmethod]屬性標記webmethods來指定具體的soapaction值。示例如下:

現在.asmx

控制代碼認為

add方法的

soapaction

值是subtract

的值是urn:math:subtract

(因為我們在類中明確定義了)。比如下面的

請求訊息呼叫

如果.asmx控制代碼沒為http請求訊息找到乙個soapaction匹配,將會丟擲乙個異常。如果你不想依賴soapaction頭來分派訊息,可以引導.asmx控制代碼使用請求元素名稱。採用這種方法需要為類標記上[soapdocumentservice]屬性的routingstyle特性,同時也應該指出webmethods不需要soapaction值(在類中設定其值為空)。如下所示:

在這種情況下,控制代碼甚至不關心

soapaction

的值,它使用請求元素的名字確定呼叫方法。比如,在下面的

請求訊息中,它希望呼叫

add方法的請求元素的名字是

add:

所以當.asmx控制代碼接收到http訊息時它要做的第一件事情就是決定如何分派訊息到對應的webmethod。在它真正呼叫方法之前,還需要將到來的xml對映到.net物件。

一旦webmethod控制代碼決定了呼叫哪個方法,它就會將xml訊息反序列化為.net物件。隨著訊息分派,控制代碼通過reflection檢查類,然後決定怎樣處理xml訊息。xmlserializer類自動完成xml和system.xml.serialization命名空間中類的對映。

xmlserializer能實現任何.net公共型別到xml schema型別的對映,有了這個適當的對映,它能自動的實現.net物件和xml例項文件的對映(見圖4)。xmlserializer受xml schema所支援功能的限制,雖不能處理所有複雜的現代物件模型(如非樹型的物件圖),卻能處理開發者常用的複雜型別。

再看前面add的例子,xmlserializer將把x和y元素對映為.net的double值(呼叫add方法時必須提供的)。add方法返回乙個double型別值給呼叫者,這也需要被序列化為soap應答訊息中的乙個xml元素。

xmlserializer也能自動處理一些複雜型別(除了上面說到的一些限制)。比如,下面的webmethod計算兩個點結構之間的距離。

請求此操作的

soap

訊息將包含乙個

distance

元素,它包含了兩個子元素,乙個稱作

orig

,另乙個是

dest

,每乙個都包括了x和

y元素,如下所示:

這種情況下

soap

應答訊息將包含乙個

distanceresponse

元素,它包含乙個

double 

型別的distanceresult

子元素。

預設的xml

對映使用方法名作為請求元素名,引數名作為子元素名。每個引數的結構依賴於型別的結構。公共欄位和屬性的名字簡單對映為子元素,如

point

類中的x和y

。應答元素的名字預設為請求元素的名字後面附加上「

response」,

應答元素也包含乙個子元素,是請求元素名字後面附加「

result

」。也有可能使用一些固定的對映屬性來打破標準的

xml對映。比如,你可以使用

[xmltype]

屬性來定製型別的名字和命名空間,使用

[xmlelement]

和[xmlattribute]

屬性來控制如何將引數或類成員分別對映為元素或屬性,也可以使用

[soapdocumentmethod]

屬性控制怎樣把方法本身對映為請求

/響應訊息中的元素名。比如,檢查下面重新定義的

distance

。它所期望的

soap

請求訊息如下:

並將產生下面的應答訊息:

.asmx控制代碼使用soap document/literal風格來實現和描述上面顯示的預設對映。意思上說wsdl定義將包含literal xml schema定義,它描述了soap訊息中用到的請求和響應元素。

.asmx控制代碼也能使用soap rpc/encoded風格。這意味著soap體中包含乙個rpc呼叫的xml代表(representation),引數用soap編碼規則來序列化。實現這些僅需將[soapdocumentservice] and [soapdocumentmethod]替換為[soaprpcservice] and [soaprpcmethod]屬性。

正如你所看到的,我們可能完全定製乙個從給定方法到soap訊息的對映。xmlserializer提供了乙個強大的序列化引擎。

除了處理引數的反序列化,.asmx控制代碼也能序列化/反序列化soap頭。soap頭的處理不同於引數,因為它們被認為是典型的無法控制的資訊,和具體的方法沒有直接的聯絡。由於這些,頭處理主要是通過中間層(interception layers),完全為webmethods遮蔽了頭處理。

然而如果想涉足於webmethod中的頭資訊,你必須提供乙個.net類,從soapheader派生而來,它代表了頭的xml schema型別。然後定義乙個此型別的成員變數作為每乙個頭例項的佔位符。最後標記每個要訪問頭的webmethod,指定你想要到達的網域名稱。

比如,下面的soap請求包括乙個用來進行身份驗證的usernametoken頭。

Web service 原理和 開發

服務端 生成服務描述檔案,以供客戶端獲取。接收客戶端發來的soap請求訊息,解析其中的方法呼叫和引數格式。根據wsdl和wsml的描述,呼叫相應的com物件來完成指定功能,並把返回值放入soap回應訊息返回給使用者。高層介面 使用高層介面,不需要知道soap和xml的任何資訊,就可以生成和使用乙個w...

webservice的原理及概念

webservice的原理及概念 1 webservice 所謂webservice就是定義了一套標準的呼叫過程 a 伺服器首先用一套標準的方法向外界描述它所提供的服務的內容,就屬於wsdl b 客戶端需要以一種標準的協議來呼叫此服務,這屬於soap.c 服務提供者將服務內容放在乙個公共的 讓大家查...

Web Service高階 一 執行原理

在web服務中,存在三個角色 服務提供者 服務請求者和服務中介,三者之間的關係如圖1 1所示 摘錄自 實現乙個完整的web服務包括以下步驟 web服務提供者設計實現web服務,並將除錯正確後的web服務通過web服務中介者發布,並在uddi註冊中心註冊 發布 web服務請求者向web服務中介者請求特...