国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

使用 Web Services Enhancements 2.0 進(jìn)行編程

2024-07-21 02:21:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 

單擊下載源代碼,可以從 microsoft download center 下載 rock paper scissors 應(yīng)用程序的源代碼。

目錄

  • rock paper scissors: 一種安全的、分布式消息處理示例應(yīng)用程序
  • 與 windows 安全性集成的 kerberos 令牌支持
  • 安全策略
  • wse 2.0 尋址
  • tcp 消息處理
  • wse 2.0 的其他功能
  • 小結(jié)

microsoft 發(fā)行了 web services enhancements (wse) 1.0 版,以在支持的產(chǎn)品中啟用安全、路由和附件,同時(shí)它還支持高級(jí) web 服務(wù)。web services enhancements 2.0(英文)已從簡(jiǎn)單支持基本協(xié)議發(fā)展到支持核心功能與操作系統(tǒng)的集成,并增強(qiáng)了策略、信任和上下文令牌功能。

wse 也是對(duì) .net framework 支持的擴(kuò)展,它用于創(chuàng)建和使用 web 服務(wù),而 wse 2.0 采用新的編程模式。過(guò)去,web 服務(wù)支持一直依賴 internet information server (iis) 作為其 http 服務(wù)器主機(jī);現(xiàn)在,wse 2.0 支持通過(guò) tcp/ip 或在進(jìn)程內(nèi)來(lái)發(fā)送消息。這樣,您可以通過(guò)對(duì)等、單向、異步等方式將消息從服務(wù)器發(fā)送到客戶端。

下面,我們將簡(jiǎn)要介紹 wse 2.0 的幾個(gè)主要功能,并假設(shè)您已熟悉 wse 1.0。有關(guān) wse 1.0 的詳細(xì)信息,請(qǐng)參閱 programming with web services enhancements 1.0 for microsoft .net(英文)。

rock paper scissors:一種安全的、分布式消息處理示例應(yīng)用程序

為了展示 wse 2.0 的各個(gè)方面,我想創(chuàng)建一個(gè)應(yīng)用程序以展示一些新安全功能和消息處理功能。具體來(lái)說(shuō),我喜歡使用 tcp 消息處理支持來(lái)顯示對(duì)等通信,并使它在 windows 安全性領(lǐng)域工作。我想到的是一個(gè)簡(jiǎn)單的分布式版本的舊 rock paper scissors 游戲,現(xiàn)在可以用 wse 2.0 進(jìn)行安全分發(fā)。

rock paper scissors 是一個(gè)兩人兒童游戲,傳統(tǒng)上包括讓每個(gè)孩子拍手三次,在第三次拍手時(shí)出示石頭、剪刀或布的形狀。根據(jù)下表中所示理由決定勝者:

 石頭布剪刀石頭 平局布裹石頭。
布方贏!石頭砸壞剪刀。
石頭方贏!布 布裹石頭。
布方贏!平局剪刀剪開(kāi)布。
剪刀方贏!剪刀 石頭砸壞剪刀。
石頭方贏!剪刀剪開(kāi)布。
剪刀方贏!平局

該游戲通常用于確定由誰(shuí)先選擇參加沙地棒球賽的選手、誰(shuí)吃最后的冰淇淋,甚至由誰(shuí)擊打?qū)Ψ降氖直邸?/p>

我們將 rock paper scissors 搬出沙地,直接應(yīng)用在具有 wse 2.0 的安全、協(xié)作、團(tuán)結(jié)的企業(yè)技術(shù)中。該游戲的消息處理結(jié)構(gòu)如下面的圖 1 所示。

圖 1:rock paper scissors 消息處理和安全模型

rock paper scissors 有兩個(gè)主要組件:一個(gè)是名為 rpsservice 的 asp.net web 服務(wù),另一個(gè)是由多個(gè)用戶運(yùn)行的對(duì)等應(yīng)用程序。rpsservice 的作用是讓用戶注冊(cè)玩游戲或?qū)ふ覍?duì)手來(lái)玩游戲。對(duì)等應(yīng)用程序先是與 rpsservice 通信以找到要與之通信的對(duì)方,然后在確定對(duì)手后直接與其對(duì)方進(jìn)通信。

對(duì)等:對(duì)于消息處理,wse 2.0 從基于傳統(tǒng) http 請(qǐng)求/響應(yīng)(即 rpc 環(huán)境)轉(zhuǎn)換為采用可能同時(shí)具有對(duì)等消息處理、異步消息處理和消息隊(duì)列的環(huán)境。

kerberos:整個(gè)應(yīng)用程序是通過(guò)使用集成的 windows kerberos 支持創(chuàng)建的。使用 wse 2.0,您可以用一種安全的方式連接網(wǎng)絡(luò)。我們將進(jìn)行驗(yàn)證、數(shù)字簽名和加密消息以確保具有最高的安全性,且這將完全基于 windows 用戶帳戶。

便捷管理:不用編寫(xiě)代碼來(lái)控制訪問(wèn),我們便可以通過(guò)策略配置文件來(lái)配置消息的安全性。通過(guò)策略文件,可以控制要實(shí)現(xiàn)的安全種類、要對(duì)消息的哪部分進(jìn)行數(shù)字簽名或加密及其實(shí)現(xiàn)方式,還可基于消息時(shí)限性控制接受條件。目前,可以控制安全性的相應(yīng)人員為:您的管理員。

rock paper scissors:該應(yīng)用程序的重要作用不在于應(yīng)用程序本身,而是它與本例中不同實(shí)體通信時(shí)使用安全消息、策略和尋址的方式。您猜不到,我正想象我的老板說(shuō):“為了決定職員今年的獎(jiǎng)金,我想讓你們每人運(yùn)行一個(gè)小的應(yīng)用程序 rockpaperscissors.exe...”

與 windows 安全性集成的 kerberos 令牌支持

我們要討論的 wse 2.0 的第一部分是支持 kerberos 安全令牌。wse 1.0 支持用戶名令牌和 x.509 安全令牌。可以將這些令牌添加到安全令牌的消息集合,并用于創(chuàng)建數(shù)字簽名或執(zhí)行加密。對(duì)于 wse 2.0 來(lái)說(shuō),當(dāng)在 windows server 2003 或帶有 service pack 1 的 windows xp 上運(yùn)行時(shí),則已添加了 kerberos 令牌支持。更重要的是,kerberos 令牌支持能夠與集成的 windows 安全性一起使用,這樣,不再需要將用戶名映射成 windows 用戶,也不用另外設(shè)置用戶數(shù)據(jù)庫(kù),可以基于 windows 用戶控制對(duì) web 服務(wù)的訪問(wèn)。

在為 rpsservice 添加代碼之前,我要做的第一件事是在自己的項(xiàng)目中添加對(duì) microsoft.web.services 程序庫(kù)的引用。如果您的計(jì)算機(jī)上安裝的是 wse 1.0,那么添加引用時(shí)注意選擇 2.0 版的程序庫(kù)很重要。幸運(yùn)的是,程序集的版本號(hào)就列在程序集名稱之后,因此可以輕松地選擇正確的程序集。圖 2 顯示的是選定了 wse 2.0 程序庫(kù)的 add reference(添加引用)對(duì)話框。請(qǐng)注意,1.0 版本的程序庫(kù)就在選定的程序庫(kù)之前。

圖 2:將引用添加到 wse 2.0 程序集

下面的代碼演示如何通過(guò)編程的方式將 kerberos 令牌添加到令牌消息集合。它是一方私下向另一方發(fā)送其動(dòng)作時(shí)所使用的代碼。該代碼使用 wse 2.0 的異步 tcp 消息功能(隨后將詳細(xì)說(shuō)明),但用于添加令牌和加密的代碼類似于 wse 1.0 中用于其他類型令牌的代碼。

using microsoft.web.services.security.kerberos;   a?|kerberostoken peertoken;   a?|peertoken = new kerberostoken("host/" + opponenturi.host);   a?|envelope.context.security.tokens.add(peertoken);envelope.context.security.elements.add(new encrypteddata(peertoken));

請(qǐng)注意,令牌是通過(guò)傳遞連接主機(jī)的名稱創(chuàng)建的。用于創(chuàng)建該令牌的 kerberos 標(biāo)簽允許當(dāng)前用戶與指示的主機(jī)進(jìn)行通信。具體來(lái)說(shuō),該令牌將用于加密要發(fā)送的消息,以便只有該遠(yuǎn)程主機(jī)才可以讀取這些消息。

與其他類型令牌不同,kerberos 令牌使用當(dāng)前的 windows 用戶安全上下文創(chuàng)建該令牌。如果您查詢已創(chuàng)建的令牌,您將會(huì)找到一個(gè) principal 成員屬性,它指示創(chuàng)建該令牌的用戶。我們從接收消息(帶有 kerberos 令牌)的代碼的主體中獲取用戶名。下面的 opponent 變量是一個(gè) kerberostoken 對(duì)象,該對(duì)象是從傳入消息的 tokens 集合中獲得的。可以像下面獲取名稱那樣來(lái)獲取關(guān)于令牌創(chuàng)建者的信息,但也可以調(diào)用 isinrole() 方法來(lái)通過(guò)編程的方式確定 active directory 組成員。

this.opposingnamelabel.text     = "playing: " + opponent.principal.identity.name;

注意:如果在 windows xp 上運(yùn)行 web 服務(wù),則使用 kerberos 令牌試圖連接到 web 服務(wù)時(shí),您可能會(huì)遇到以下錯(cuò)誤:

microsoft.web.services.security.securityfault: an invalid security token was provided ---> system.security.securityexception: unable to validate incoming kerberos st.  lsalogonuser failed with the following message: a required privilege is not held by the client.  substatus is 0.

出現(xiàn)該錯(cuò)誤是由于調(diào)用名為 logonuser 的安全 api 時(shí),aspnet 帳戶無(wú)法驗(yàn)證 kerberos 令牌。調(diào)用 logonuser api 的用戶帳號(hào)要求具有“作為操作系統(tǒng)的一部分來(lái)操作”特權(quán)。在默認(rèn)情況下,aspnet 帳戶(即運(yùn)行 asp.net 代碼的帳戶)不具有該特權(quán)。建議您在合適的服務(wù)器平臺(tái)如 windows server 2003 上運(yùn)行已設(shè)置 kerberos 安全的 web 服務(wù)。在 windows server 2003 上,調(diào)用 logonuser 時(shí)不需要“作為操作系統(tǒng)的一部分來(lái)操作”特權(quán)。在 windows xp 上,可以使用 local security policy 管理應(yīng)用程序來(lái)配置擁有“作為操作系統(tǒng)的一部分來(lái)操作”特權(quán)的帳戶,包括 aspnet 帳戶,但應(yīng)該注意這會(huì)造成 asp.net 應(yīng)用程序的安全性不夠嚴(yán)密。

安全策略

雖然以上討論的代碼與 wse 1.0 中的代碼非常相似,但它具有一個(gè)優(yōu)點(diǎn):將 principal 對(duì)象與一個(gè)令牌關(guān)聯(lián),可以用來(lái)查找某個(gè)具體安全令牌的特定屬性。這種方法存在的問(wèn)題在于仍要編寫(xiě)代碼來(lái)確定應(yīng)屬于管理任務(wù)的訪問(wèn)功能。為此,wse 2.0 提供了創(chuàng)建策略文件支持。

策略文件基于 ws-policy 規(guī)范,該規(guī)范是為允許 web 服務(wù)聲明傳入消息有關(guān)安全性等方面的要求而創(chuàng)建的。如果希望簽名或者加密所有或部分消息,wse 2.0 允許我們控制 web 服務(wù)的用戶在消息中使用的安全令牌類別,以及控制對(duì)接收消息時(shí)限的限制,甚至可以為傳入的消息指定角色成員限制。

以下策略文件說(shuō)明 web 服務(wù)接收的消息應(yīng)使用 kerberos 令牌對(duì)消息主體進(jìn)行簽名。

<?xml version="1.0" encoding="utf-8"?><policydocument     xmlns="http://schemas.microsoft.com/wse/2003/06/policy">  <mappings       xmlns:wse="http://schemas.microsoft.com/wse/2003/06/policy">    <mapdefault         policy="#policy-5903e02b-9c11-4dc5-8ca0-42d4e9d0bcde" />  </mappings>  <policies       xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">    <wsp:policy         wsu:id="policy-5903e02b-9c11-4dc5-8ca0-42d4e9d0bcde"         xmlns:wsp="http://schemas.xmlsoap.org/ws/2002/12/policy">      <wsse:integrity wsp:usage="wsp:required"          xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">        <wsse:tokeninfo>          <securitytoken   xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext"><wsse:tokentype>wsse:kerberosv5st</wsse:tokentype>          </securitytoken>        </wsse:tokeninfo>        <wsse:messageparts dialect="http://schemas.xmlsoap.org/2002/12/wsse#part">          wsp:body()        </wsse:messageparts>      </wsse:integrity>    </wsp:policy>  </policies></policydocument>

policydocument 根元素有兩個(gè)子元素:mappings 和 policies。policies 元素含有一個(gè)或多個(gè)表示特定要求集的 policy 元素。在示例中,策略包含一個(gè) integrity 要求,表示該消息需要數(shù)字簽名。tokeninfo 元素包含關(guān)于所需令牌種類的信息,本示例中為 kerberos 令牌。最后,這一特定完整性要求指出必須簽名的文檔部分為正文,這是使用 messageparts 元素指示的。

policydocument 的 mappings 部分僅將特定終結(jié)點(diǎn)與 policies 部分中的策略關(guān)聯(lián)。本示例不包括特定終結(jié)點(diǎn)的任何映射,僅包括單一的默認(rèn)映射。

除了實(shí)際創(chuàng)建策略文件以外,還需要讓 wse 程序庫(kù)知道該策略的存在。因此,有必要配置 web 服務(wù)以使用創(chuàng)建的策略文件。為此,需要修改 web.config 文件。下面的 web.config 文件給出了為啟用 wse soapextension、啟用 wse 配置部分中的處理程序以及添加接收策略緩存而作的更改。

<?xml version="1.0" encoding="utf-8"?><configuration>  <configsections>    <!-- 添加對(duì)配置部分的引用。 請(qǐng)注意,         類型名稱要換行以便于閱讀,并且不應(yīng)包含         換行符。-->    <section name="microsoft.web.services"         type="microsoft.web.services.configuration        .webservicesconfiguration, microsoft.web.services,         version=2.0.0.0, culture=neutral,         publickeytoken=31bf3856ad364e35" />  </configsections>  <system.web><!-- 為了簡(jiǎn)潔,刪除其他元素 -->    <webservices>      <soapextensiontypes>        <!-- 添加 wse soapextension。請(qǐng)注意, 類型名稱要換行以便于閱讀并且 不應(yīng)包含換行符。-->        <add type="microsoft.web.services.webservicesextension, microsoft.web.services, version=2.0.0.0, culture=neutral,publickeytoken=31bf3856ad364e35" priority="1" group="0" />      </soapextensiontypes>    </webservices>  </system.web>  <!-- wse configuration section -->  <microsoft.web.services>    <policy>      <receive>        <cache name="policycache.xml" />      </receive>    </policy>  </microsoft.web.services></configuration>

至此,已將 web 服務(wù)配置成只接受符合 policycache.xml 文件中策略要求的請(qǐng)求。

如果需要讓管理員為特定的 web 服務(wù)配置策略,我們同樣希望對(duì)使用 web 服務(wù)的應(yīng)用程序進(jìn)行類似配置。總而言之,如果管理員更改策略后我們必須重新生成使用的應(yīng)用程序,則并沒(méi)有完全實(shí)現(xiàn)配置消息要求時(shí)無(wú)需重新生成 web 服務(wù)的功能。

要為使用的應(yīng)用程序添加該功能來(lái)發(fā)送符合特定策略的消息,需要本地具有該程序可以使用的策略文件。對(duì)于要調(diào)用 .asmx web 服務(wù)的 rock paper scissors 對(duì)等應(yīng)用程序,我們只是將 policycache.xml 文件復(fù)制到該可執(zhí)行程序的工作目錄。如同對(duì) web 服務(wù)的處理,將該應(yīng)用程序配置成使用其 .config 文件中的策略文件(本示例中為 rockpaperscissors.exe.config)。該配置文件如下所示。

<?xml version="1.0" encoding="utf-8"?><configuration>  <configsections>    <!-- 添加對(duì)配置部分的引用。請(qǐng)注意,         類型名稱要換行以便于閱讀,并且不應(yīng)包含         換行符。-->    <section name="microsoft.web.services"        type="microsoft.web.services.        configuration.webservicesconfiguration,         microsoft.web.services, version=2.0.0.0,         culture=neutral, publickeytoken=31bf3856ad364e35" />  </configsections>  <microsoft.web.services>    <policy>      <send>        <cache name="policycache.xml" />      </send>    </policy>  </microsoft.web.services></configuration>

對(duì)等應(yīng)用程序?qū)⑼ㄟ^(guò)發(fā)送符合 policycache.xml 文件中的要求的消息與 web 服務(wù)進(jìn)行通信。

wse 2.0 尋址

wse 1.0 與 wse 2.0 之間的區(qū)別之一是對(duì) ws-addressing 的支持。ws-addressing 替換了 wse 1.0 中支持的 ws-routing 規(guī)范的大部分功能。從功能方面來(lái)說(shuō),ws-addressing 不是將重點(diǎn)放在路由路徑上,而是提供一種機(jī)制將 to 和 from 標(biāo)頭添加到 soap 信封中。ws-addressing 也支持 action、replyto 和 faultto 標(biāo)頭。action 標(biāo)頭類似于通過(guò) http 發(fā)送 soap 消息時(shí)通常使用的 soapaction http 標(biāo)頭。對(duì)于 .asmx web 服務(wù),http soapaction 標(biāo)頭用于確定接收傳入消息時(shí)應(yīng)調(diào)用服務(wù)的哪種 web 方法。與此類似,action soap 標(biāo)頭用于確定通過(guò)非 http 傳輸接收消息時(shí)要調(diào)用的函數(shù)。

在 rock paper scissors 應(yīng)用程序中,我們還將利用 replyto 標(biāo)頭來(lái)確定接收下一消息的地址。當(dāng)對(duì)等應(yīng)用程序之一向 rpsservice 發(fā)送單向 registerplayer 消息時(shí),將指定一個(gè) replyto 終結(jié)點(diǎn),指示對(duì)等通信開(kāi)始時(shí)用來(lái)接收對(duì)方發(fā)送的消息的地址。與此類似,當(dāng)?shù)诙€(gè)對(duì)等應(yīng)用程序?qū)?findplayer 消息發(fā)送到 rpsserver 時(shí),rpsserver 將返回一個(gè)帶有 replyto 標(biāo)頭的消息,該標(biāo)頭指示第一個(gè)對(duì)等應(yīng)用程序的終結(jié)點(diǎn)。這就告訴第二個(gè)對(duì)等應(yīng)用程序應(yīng)該將自己的下一消息發(fā)送到第一個(gè)對(duì)等應(yīng)用程序的終結(jié)點(diǎn)。在余下的對(duì)等消息中,繼續(xù)指定 replyto 標(biāo)頭來(lái)不斷指示接收下一消息的地址。

下面是對(duì)等應(yīng)用程序使用的部分代碼,在代碼中,首先偵聽(tīng)對(duì)等通信,然后在調(diào)用 rpsserver registerplayer web 方法之前通過(guò) replyto 標(biāo)頭指示 uri。

mypeeruri     = new uri("soap.tcp://"       + system.net.dns.gethostname()       + ":3131/rpspeer1");soapreceivers.add(mypeeruri, typeof(peerservice));rpsserv.rpsserverwse proxy = new rpsserv.rpsserverwse();proxy.requestsoapcontext.replyto = mypeeruri;

tcp 消息處理

在 wse 2.0 中,消息處理是新增功能的主要部分。wse 2.0 通過(guò)異步 tcp 或請(qǐng)求/響應(yīng)方式 tcp 為進(jìn)程中的通信提供支持。在本示例的 rock paper scissors 應(yīng)用程序中,我們將發(fā)送消息來(lái)指示玩家對(duì)于特定游戲?qū)嵗欠襁x擇了石頭、布或剪刀。由于我們依靠用戶交互來(lái)確定發(fā)送消息的內(nèi)容,我們不可能無(wú)限地等待需要發(fā)送響應(yīng)的請(qǐng)求,因此,我們使用異步 tcp 消息來(lái)實(shí)現(xiàn)特定游戲的通信。一個(gè)人發(fā)送其動(dòng)作后應(yīng)用程序耐心的等待,直到對(duì)方玩家發(fā)送其動(dòng)作。您可以將這看作類似于向倉(cāng)庫(kù)發(fā)送發(fā)貨單,必須等待,直到有人手動(dòng)包裝材料,才能發(fā)送一個(gè)指示請(qǐng)求完成的響應(yīng)。

在上面顯示的 replyto 代碼中,給出了建立 tcp 終結(jié)點(diǎn)需要的部分代碼。通過(guò) soapreceiver 類中的 add 方法,可以注冊(cè)偵聽(tīng)代碼。在本示例中,我們創(chuàng)建了一個(gè)名為 peerservice 的類,它是偵聽(tīng)傳入的 rock paper scissors 游戲的 soapreceiver 類的子類。peerservice 類只是重載了處理傳入消息的 receive 方法。該類的代碼如下所示:

public class peerservice : soapreceiver{    public static form1 form;    protected override void receive(soapenvelope envelope)    {        form.opponentplay = (char)envelope.getbodyobject(typeof(char));        foreach (securitytoken tok in envelope.context.security.tokens)        {if (tok is kerberostoken){    form.opponent = (kerberostoken)tok;    break;}        }        form.opponenturi = envelope.context.replyto;        if (form.peertoken == null)form.peertoken     = new kerberostoken("host/"         + form.opponenturi.host);        form.opposingnamelabel.invoke(new form1.receiveplaydelegate(form.receiveplay));    }}

receive 方法采用 soapenvelope 對(duì)象作為參數(shù)。soapenvelope 類是從 xmldocument 類派生得到的,這樣,您可以通過(guò)標(biāo)準(zhǔn)的 xml dom 接口來(lái)訪問(wèn) soap 正文和標(biāo)頭。我們沒(méi)有使用 dom 接口,而是利用 getbodyobject 方法基于 soap 消息正文中的 xml 來(lái)創(chuàng)建一個(gè)類,該方法在功能上使用了 xmlserializer。我們將動(dòng)作信息保存在 form 類的一個(gè)公有屬性中。

我們還從請(qǐng)求中獲取 kerberos 令牌并將它保存。它將用于以后獲取對(duì)手的名稱。然后,保存對(duì)手的 replyto uri,以便我們了解接收響應(yīng)的地址。我們亦可基于 uri 中顯示的主機(jī)先行建立 kerberos 令牌,它將用于加密返回的消息。

soapreceivers 支持將偵聽(tīng)傳入的連接,并在收到消息時(shí)調(diào)用指示的類的 receive 方法。進(jìn)程的線程池中的某個(gè)線程將調(diào)用 receive 方法,大多數(shù)情況下,該線程不是處理應(yīng)用程序主窗口消息泵的線程。因此,在 receive 方法的末尾,我通過(guò) windows 窗體中的一個(gè)控件調(diào)用 invoke 方法。這就啟動(dòng)了主窗口線程中指定的委托功能,以使窗體中各種控件的常規(guī)交互正確進(jìn)行。在本示例中,委托確定兩次動(dòng)作后的贏家并相應(yīng)地更新用戶界面。

當(dāng)調(diào)用 soapreceivers.add 方法(下面再次顯示了該方法)時(shí),我們傳遞兩個(gè)參數(shù):一個(gè) uri 和偵聽(tīng)類的類別類型。uri 指示了多項(xiàng)內(nèi)容。首先,uri 類型為 soap.tcp。這表示它是一個(gè)通過(guò) tcp 發(fā)送的 soap 消息的 uri。uri 的主機(jī)名稱指示要偵聽(tīng)的計(jì)算機(jī),其后是用來(lái)偵聽(tīng)傳入連接的 tcp 端口號(hào)。在本示例中,我們使用端口 3131。最好不要使用 1000 以下的端口號(hào),因?yàn)樗鼈兪菫樘囟愋偷膽?yīng)用程序而保留的(例如,端口 80 用于 http 服務(wù)器)。

mypeeruri     = new uri("soap.tcp://"       + system.net.dns.gethostname()       + ":3131/rpspeer1");soapreceivers.add(mypeeruri, typeof(peerservice));

向異步 tcp 偵聽(tīng)器發(fā)送消息也同樣簡(jiǎn)單。我們只要?jiǎng)?chuàng)建一個(gè) soapenvelope 對(duì)象,并使用 setbodyobject 方法將對(duì)象序列化到正文的 xml 中。soapenvelope 包含一個(gè) context 屬性,該屬性的使用類似于常規(guī) http 綁定的 soap 交互時(shí)使用的 soaprequestcontext 和 soapresponsecontext 屬性。我們用它來(lái)建立需要的 action soap 標(biāo)頭和可選的 replyto 標(biāo)頭。我們還要添加前面創(chuàng)建的 kerberos 令牌并用它來(lái)加密消息。對(duì)于發(fā)送消息,我們使用 soapsender 類,該類與我們用于偵聽(tīng)傳入消息的 soapreceiver 類相對(duì)應(yīng)。soapsender 類獲取其構(gòu)造函數(shù)中的終結(jié)點(diǎn) uri,然后將傳遞的 soapenvelope 發(fā)送到 send 方法。發(fā)送對(duì)等消息的代碼如下所示。

// send messagesoapenvelope envelope = new soapenvelope();envelope.setbodyobject(myplay);envelope.context.action = new action(opponenturi.tostring());envelope.context.security.tokens.add(peertoken);envelope.context.security.elements.add(    new encrypteddata(peertoken));envelope.context.replyto = mypeeruri;soapsender peerproxy = new soapsender(this.opponenturi);peerproxy.send(envelope);

您可以從 microsoft download center 獲取 rock paper scissors 應(yīng)用程序的完整源代碼(英文)。

wse 2.0 的其他功能

通過(guò) rock paper scissors 應(yīng)用程序,我們研究了 wse 2.0 的許多功能,但是還有許多其他功能。用戶名令牌還可以與 windows 安全性集成,如 kerberos 令牌。由于支持安全上下文令牌,您可以建立有效的對(duì)稱密鑰,用于對(duì)兩個(gè)終結(jié)點(diǎn)之間的多個(gè)消息進(jìn)行加密,而無(wú)需為每個(gè)消息生成一個(gè)新的密鑰。除了安全上下文令牌以外,還支持創(chuàng)建安全性令牌服務(wù) (security token service),該服務(wù)為兩個(gè)終結(jié)點(diǎn)之間的通信頒發(fā)上下文令牌。

對(duì)于消息處理,我們僅討論了對(duì)發(fā)送異步 tcp 消息的支持,其實(shí)對(duì)同步請(qǐng)求/響應(yīng)的支持也是同樣出色。該支持使用 soapmethod 屬性,類似用于 .asmx web 服務(wù)的 webmethod 屬性,而且操作也相似。此外還支持在單獨(dú)的應(yīng)用程序空間中調(diào)用服務(wù),這似乎不是很好,但 windows 消息泵(創(chuàng)建窗式應(yīng)用程序的基礎(chǔ))同樣基于在單獨(dú)的應(yīng)用程序空間中發(fā)送消息。

wse 2.0 更為吸引人的地方之一是具有許多可擴(kuò)展點(diǎn)。您可以做任何事情,包括從創(chuàng)建自己的自定義令牌處理程序到添加自己的策略支持。像 wse 1.0 一樣,您仍然可以擴(kuò)大處理范圍,但更重要的是如何在更高的層次上前進(jìn)并利用已有的工作。

小結(jié)

在 msdn 中,將會(huì)有更多的文章深入探討 wse 2.0。我們將深入地討論策略、安全性、消息處理和其他內(nèi)容。希望 rock paper scissors 為您展示了使用 wse 2.0 開(kāi)發(fā)的高級(jí) web 服務(wù)支持所具有的一些奇特新功能。同時(shí)希望它能像引發(fā)我們一樣引發(fā)您的想象力,在全新的環(huán)境中開(kāi)發(fā) web 服務(wù)應(yīng)用程序。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长兴县| 盐源县| 四平市| 舞阳县| 五莲县| 宜章县| 荣昌县| 抚松县| 汨罗市| 巴林左旗| 新河县| 孟津县| 襄垣县| 信丰县| 阳高县| 含山县| 醴陵市| 常德市| 闽侯县| 淮滨县| 泽州县| 双柏县| 沅江市| 灌云县| 阿拉尔市| 教育| 莱州市| 响水县| 攀枝花市| 宿迁市| 马龙县| 苏尼特左旗| 侯马市| 莱州市| 德保县| 耒阳市| 莒南县| 长子县| 宣汉县| 福泉市| 佛冈县|