soap加密
1. 如何給soap message element加密
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<UserLogin xmlns="http://bom.syd.com">
<in0>R0+TrgbtXiw=</in0>
<in1>R0+TrgbtXiw=</in1>
<in2>1</in2>
</UserLogin>
</soap:Body>
</soap:Envelope>
2. soapheader文件是什麼格式,怎樣獲取他並進行驗證
header就是soap的頭
soap結構是
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
這里哪個Header就是了。
如何做驗證都是自己決定
例如header中傳輸個用戶名、密碼什麼的或者時間戳等加密的方式 都可以
3. 證書調用Paypal的soap介面,報文中的密碼是採用什麼方式加密的,有相關實施經驗的支援下
使用SSL協議進行的加密
4. soap是什麼牌子,
SOAP
求助編輯網路名片
SOAP:簡單對象訪問協議,簡單對象訪問協議(SOAP)是一種輕量的、簡單的、基於 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的信息。 SOAP 可以和現存的許多網際網路協議和格式結合使用,包括超文本傳輸協議( HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。
目錄
簡介四個部分
協議結構
語法規則
SOAP 核心技術
SOAP 的優點
php SOAP實例
消息格式
剖析SOAP封套
SOAP-RPC
SOAP用例
小結簡介 四個部分
協議結構
語法規則
SOAP 核心技術
SOAP 的優點
PHP SOAP實例
消息格式
剖析SOAP封套
SOAP-RPC
SOAP用例小結展開 編輯本段簡介
簡單對象訪問協議含義 這里之所以說是簡單,是因為它是基於已經廣泛使用的兩個協議:HTTP和XML,所以業界把這種技術稱為「它是第一個沒有發明任何新技術的技術",之所以說是對象,是因為把訪問的Web服務稱為對象,既然服務是對象,那麼服務肯定有相關的屬性和調用行為,這些屬性和行為是通過WSDL來描述的。如果按「簡單的對象訪問協議」來理解,相比「簡單對象訪問協議」要容易些。
四個部分
soap。n.(英文)肥皂 SOAP:簡單對象訪問協議 (SOAP:Simple Object Access Protocol) SOAP 包括四個部分: SOAP 封裝:它定義了一個框架 , 該框架描述了消息中的內容是什麼,誰應當處理它以及它是可選的還是必須的。 SOAP 編碼規則:它定義了一種序列化的機制,用於交換應用程序所定義的數據類型的實例。 SOAP RPC 表示:它定義了用於表示遠程過程調用和應答的協定。 SOAP 綁定:定義了一種使用底層傳輸協議來完成在節點間交換SOAP封裝的約定。 SOAP 消息基本上是從發送端到接收端的單向傳輸,但它們常常結合起來執行類似於請求 / 應答的模式。所有的 SOAP 消息都使用 XML 編碼。一條 SOAP 消息就是一個包含有一個必需的 SOAP 的封裝包,一個可選的 SOAP 標頭和一個必需的 SOAP 體塊的 XML 文檔。 把 SOAP 綁定到 HTTP 提供了同時利用 SOAP 的樣式和分散的靈活性的特點以及 HTTP 的豐富的特徵庫的優點。在HTTP上傳送 SOAP 並不是說 SOAP 會覆蓋現有的 HTTP 語義,而是 HTTP 上的 SOAP 語義會自然的映射到 HTTP 語義。在使用 HTTP 作為協議綁定的場合中, RPC 請求映射到 HTTP 請求上,而 RPC 應答映射到 HTTP 應答。然而,在 RPC 上使用 SOAP 並不僅限於 HTTP 協議綁定。 SOAP也可以綁定到TCP和UDP協議上。
協議結構
SOAP 消息格式: SOAP 標頭 <SOAP-ENV: Envelope Attributes> <SOAP-ENV:Body Attributes> </SOAP-ENV:Body> </SOAP-ENV:Envelope>目前主要在web服務中運用。
編輯本段語法規則
這里是一些重要的語法規則: SOAP 消息必須用 XML 來編碼 SOAP 消息必須使用 SOAP Envelope 命名空間 SOAP 消息必須使用 SOAP Encoding 命名空間 SOAP 消息不能包含 DTD 引用 SOAP 消息不能包含 XML 處理指令
編輯本段SOAP 核心技術
SOAP採用了已經廣泛使用的兩個協議:HTTP 和XML。HTTP用於實現 SOAP 的RPC 風格的傳輸, 而XML 是它的編碼模式。採用幾行代碼和一個XML 解析器, HTTP 伺服器( MS 的 IIS 或 Apache) 立刻成為SOAP 的 ORBS。SOAP 通訊協議使用 HTTP 來發送XML 格式的信息。HTTP與RPC 的協議很相似,它簡單、 配置廣泛,並且對防火牆比其它協議更容易發揮作用。HTTP 請求一般由 Web 伺服器軟體(如 IIS 和Apache)來處理, 但越來越多的應用伺服器產品正在支持HTTP。XML 作為一個更好的網路數據表達方式( NDR)。SOAP 把 XML 的使用代碼化為請求和響應參數編碼模式, 並用HTTP 作傳輸。具體地講, 一個SOAP 方法可以簡單地看作遵循SOAP編碼規則的HTTP請求和響應, 一個 SOAP 終端則可以看作一個基於HTTP 的URL, 它用來識別方法調用的目標。像CORBA/ IIOP一樣, SOAP不需要具體的對象綁定到一個給定的終端, 而是由具體實現程序來決定怎樣把對象終端標識符映像到伺服器端的對象。
編輯本段SOAP 的優點
(1) SOAP 是可擴展的。SOAP 無需中斷已有的應用程序, SOAP 客戶端、 伺服器和協議自身都能發展。 而且SOAP 能極好地支持中間介質和層次化的體系結構。 (2) SOAP 是簡單的。客戶端發送一個請求,調用相應的對象, 然後伺服器返回結果。這些消息是XML 格式的,並且封裝成符合HTTP 協議的消息。因此,它符合任何路由器、 防火牆或代理伺服器的要求。 (3) SOAP 是完全和廠商無關。SOAP可以相對於平台、 操作系統、 目標模型和編程語言獨立實現。另 外,傳輸和語言綁定以及數據編碼的參數選擇都是由具體的實現決定的。 (4) SOAP 與編程語言無關。SOAP 可以使用任何語言來完成, 只要客戶端發送正確SOAP 請求( 也就 是說, 傳遞一個合適的參數給一個實際的遠端伺服器)。SOAP 沒有對象模型, 應用程序可以捆綁在任何 對象模型中。 (5) SOAP 與平台無關。SOAP 可以在任何操作系統中無需改動正百分比法辦法常運行。
編輯本段PHP SOAP實例
php提供了一個專門用於soap操作的擴展庫,使用該擴展庫後 可以直接在php中進行soap操作。下面將介紹soap的基本操作。 一、soap擴展的使用方法 php的soap擴展庫通過soap協議實現了客服端與伺服器端的 數據交互操作。從php5.0後,php就自帶了soap的支持。使用 soap擴展庫首先需要修改php安裝目錄下的配置文件php.ini 來激活soap擴展庫。 在php.ini文件中找到如下所示的一行代碼,去掉前面的注釋(;)。 ;extension=php_soap.dll 修改後,重啟web伺服器即可激活soap擴展。在soap擴展庫中,主要 包括三種對象。 1、SoapServer SoapServer用於創建php伺服器端頁面時定義可被調用的函數及返回 響應數據。創建一個SoapServer對象的語法格式如下: $soap = new SoapServer($wsdl,$array); 其中,$wsdl為soap使用得wsdl文件,wsdl是描述Web Service的一種 標准格式,若將$wsdl設置為null,則表示不使用wsdl模式。$array是 SoapServer的屬性信息,是一個數組。 SoapServer對象的addFunction方法是用來聲明哪個函數可以被客戶端調用, 語法格式如下: $soap->addFunction($function_name); 其中,$soap是一個SoapServer對象,$function_name是需要被調用的函數名。 SoapServer對象的handle方法用來處理用戶輸入並調用相應的函數,最後返回 給客戶端處理的結果。語法格式如下: $soap->handle([$soap_request]); 其中,$soap是一個SoapServer對象,$soap_request是一個可選參數,用來表示 用戶的請求信息。如果不指定$soap_request,則表示伺服器將接收用戶的全部 請求。 2、SoapClient SoapClient用於調用遠程伺服器上的SoapServer頁面,並實現了對相應函數的調用 。創建一個SoapClient對象的語法格式如下: $soap = new SoapClient($wsdl,$array); 其中,參數$wsdl和$array與SoapServer相同。 創建SoapClient對象後,調用服務端頁面中的函數相當於調用了SoapClient的方法, 創建語法如下: $soap->user_function($params); 其中,$soap是一個SoapClient對象,user_function是伺服器端要調用的函數,$params 是要傳入函數的參數。 3、SoapFault SoapFault用於生成soap訪問過程中可能出現的錯誤。創建一個soapFault對象的語法格式 如下: $fault = new SoapFault($faultcode,$faultstring); 其中,$faultcode是用戶定義的錯誤代碼,$faultstring是用戶自定義的錯誤信息。soapFault 對象會在伺服器端頁面出現錯誤時自動生成,或者通過用戶自行創建SoapFault對象時生成。對於 Soap訪問時出現的錯誤,客戶端可通過捕捉SoapFalut對象來獲得相應的錯誤信息。 在客戶端捕獲SoapFault對象後,可以通過下面的代碼獲得錯誤代碼和錯誤信息。 $fault->faultcode;//錯誤代碼 $fault->faultstring;//錯誤信息 其中,$fault是在前面創建的SoapFault對象。 已刪除無關的內容。
編輯本段消息格式
SOAP在標准化消息格式環境中,可以做所有它能完成的工作。消息的主體部分 是「text/xml」形式的MIME類型,並且包含一個SOAP封套。該封套是一個XML文 檔。封套包含了 報頭(可選的)和報文(必須有的)。封套的報文部分總是用於 最終接收的消息,而報頭項目可以確定執行中間處理的目標節點。附件、二進制 數字及其他項目可以附加到報文上。 SOAP提供了一種讓客戶端指定哪個中間處理節點必須處理報頭項目的方法。由 於報頭與SOAP消息的主體內容是互不相關的,所以可用它們給消息添加信息,而 不會影響對消息報文的處理。 例如,報頭可用於為報文中包含的請求提供數字簽名。在這種情形下,身份驗 證/授權伺服器可以處理報頭項目獨立於報文可以剝離信息以驗證簽名。 一旦通過驗證,封套的其餘部分將被傳遞給SOAP伺服器,它將對消息的報文進行 處理。深入研究一下SOAP封套,有助於明了SOAP報頭和報文元素的位置和用途。
編輯本段剖析SOAP封套
SOAP 1.1規范提供了下面的封套示例:SOAP-ENV:mustUnderstand="1" 5DEF 在這個例子中,GetLastTradePrice請求被傳送給網路上某個位置的一個存儲 -引用服務。 該請求帶有一個字元型參數,一個訂單符號,並在SOAP響應中返回一 個浮點數。SOAP封套是表示SOAP消息的XML文檔的頂層元素。XML命名空間用於將SOAP標識 符與應用程序的特定標識符區分開。XML命名空間在SOAP中使用很頻繁,以把消息 的元素的作用域限制在一個特定的領域。理解SOAP命名空間有助於熟悉XML命名空 間規范。如果您沒有理解命名空間,也可以簡單地把它看作一種鄰近的標識符, 它通過把SOAP元素與特定的位置(真實的或想像的)相關聯,從而有助於惟一地 標識SOAP元素。 命名空間 上面例子中的第一個命名空間參照了在SOAP消息中定義元素和屬性的SOAP模式。 第二個命名空間參照了SOAP編碼,即前文中討論過的「Section 5」數據類型。 由於沒有指定額外的通用元素編碼,這種編碼將適用於整篇文檔。 報頭 在SOAP封套報頭示例中標識的第一個元素是一個transaction(交易)元素,它 帶有一個命名空間屬性和一個值為1的mustUnderstand屬性。既然mustUnderstand的屬性值設為1 ,接受該消息的伺服器必須在該transaction節點上執行中間處理。您可以對此 作這樣的解釋:伺服器與客戶端事先已就管理該報頭元素處理的語義達成了一 致,因而伺服器確切地知道要處理的元素的內容,本例中元素的內容是「5」。 如果接收消息的伺服器不理解transaction報頭的語義,它就會拒絕請求並拋出 一個錯誤。錯誤元素是SOAP報文和定義良好的機制的一個特殊部分,用於把錯誤信 息送回給客戶端。 像這樣的中間處理節點是SOAP可擴展性的一個例子。客戶端在SOAP消息中包含 這樣的節點,以在可以處理消息的報文內容前,指示要發生的特殊的處理需要。 要保證向後兼容不能提供這種處理的現有的伺服器,只需把mustUnderstand 屬性設置為0,它使操作是可選的。除了定義像上例中所示的transaction節點外,SOAP消息還可包含報頭項目, 它們用於指定節點執行身份驗證處理、加密、狀態的永久性、業務邏輯處理等。 報頭有助於把SOAP構建成一種可擴展的模態包模型。只需記住報頭處理是完全獨 立於SOAP消息的報文的。 報文 上面例子中的SOAP報文包含一個XML載荷,我們可以推測RPC沒有為我們對其作 詳細解釋。SOAP不僅是一種模態包模型,它還是一種相當神秘的包模型。沒有什麼跡象清楚地顯示RPC將要開始做什麼。我們在報文中所看到的是幾個 XML元素,其中一個用命名空間進行了限制。它取決於SOAP伺服器理解文檔語義並 執行正確的處理。事實上,伺服器提供了一種架構,以有意義的方式處理XML載 荷。這里的「有意義」意味著伺服器在某些後台資料庫上調用遠程過程,以為消 息報文中包含的股票-符號元素接收股票價格。所有這些魔術般的操作都是在SOAP RPC幕後發生的。
編輯本段SOAP-RPC
SOAP消息本質上是一種從發送方到接收方的單向傳輸,但是SOAP經常組合到實 現請求/響應機制中。要讓RPC使用SOAP,必須遵循幾條規則。首先,請求和響應 消息必須被編碼成結構類型。對一個操作的每一個輸入參數,都必須有一個同名 元素(或輸入結構的成員)作為參數。對每一個輸出參數,都必須有一個名稱匹 配的元素(或輸出結構的成員)。 基於RPC的觀點,會省略一些更早一點顯示的SOAP消息。只帶有報文部分的 SOAP請求與響應封套如下所示: 請求 DEF響應 22.50請求要調用GetLastTradePrice方法。注意響應定義了 GetLastTradePriceResponse操作。對附加響應到響應操作尾部的 一個常用的SOAP調用規則是:創建響應結構。這種輸出結構包含一個名稱為 price的元素,它返回方法調用的結果,假定為浮點型。 在SOAP封套中沒有什麼地方的數據類型是顯式聲明的,注意到這一點很重要, 這樣如果只查看SOAP消息,就不會知道符號類型或結果參數price(價格)的類 型。客戶端應用程序一般通過「Section 5」編碼定義數據類型,或通過與伺服器 私下達成的協議來定義數據類型。在任何一種情況下,這些包含在SOAP消息中的 定義都不是顯式的。 最後,為了進行RPC,需要一種低級協議如HTTP。盡管SOAP 1.0規范強制要求 使用HTTP作為傳輸協議,但SOAP 1.1規范(及其姊妹規范「帶有附件的SOAP消息」 )允許使用FTP、SMTP、甚至(可能)原始的TCP/IP套接字。所有這些對SOAP通用 的序列化和編碼規則,也適用於RPC參數。
編輯本段SOAP用例
Internet上某些地方的客戶端應用程序使用Web服務。 Web服務(通過SOAP)顯示對象方法。 對象方法訪問Web上任意位置的遠程數據。 對這些網路命題應用傳遞邏輯,我們可以為Web服務和SOAP下一個總的結論: 某些位置的客戶端可以使Web上任意位置的數據。這就是所要證明的。 下面是更加詳細一點的用例。 SOAP客戶端使用UDDI注冊來查找Web服務。不用直接操作WSDL,大多數情況下SOAP應用程序將硬連接到使用特定類型的埠和特定樣式的綁定,並且它將 通過UDDI動態配置要調用的、與發現的Web服務匹配的服務地址。 客戶端應用程序創建SOAP消息,它是一個可執行想要的請求/響應操作的 XML文檔。 客戶端把SOAP消息傳送給監聽SOAP請求的Web伺服器上的JSP或ASP頁面。 SOAP伺服器解析SOAP包並在其領域調用合適的對象方法,在SOAP文檔中包 含的參數中傳遞。在SOAP伺服器接收消息之前,中間處理節點可以執行SOAP報 頭指示的特殊功能,可視情況確定是否執行這步操作。 請求對象執行指示的功能,並返回數據給SOAP伺服器,它把響應打包到 SOAP封套中。伺服器把SOAP封套包裹在要發送回請求機器的響應對象中,如 servlet或COM對象。 客戶端接收對象,剝離出SOAP封套並把響應文檔發送給最初發出請求的程 序,完成請求/響應循環。
編輯本段小結
SOAP是一種基於XML的協議,它用於在分布式環境中發送消息,並執行遠程過 程調用。使用SOAP,不用考慮任何特定的傳輸協議(盡管通常選用HTTP協議), 就能使數據序列化。用SOAP來構建平台與語言中性的互操作系統是一個好的選擇。總之,SOAP和 Web服務已為在XML上構建分布式應用程序基礎結構所需的一切都考慮好了。通過解決COM和Java組件對象模型之間的沖突,SOAP把多個平台在訪問數據時所出現的 不兼容性問題減至最少。先把這些討論放在一邊,SOAP是一種適用於所有類型的對象實體的理想的媒介 即使對於像Brad Pitt和Edward Norton之類的好萊塢電影角色也可用作 一種通信媒介。就像在電影中一樣,期待著這種新技術帶來震撼世界的效果。
5. microsoft soap toolkit2.0 怎麼設置 targetnamespace
與任何分布式協議相同,成功的 SOAP 應用程序的關鍵在於獲得安全性許可權。SOAP 標准不指定任何安全性機制,而是將安全處理委派給傳輸層。對 SOAP Toolkit 2.0 而言,傳輸層是 HTTP。在 HTTP 上運行的 SOAP 基本上是一個 Web 應用程序,與其它在 IIS 上運行的 ASP 或 ISAPI 應用程序很相似。SOAP 的身份驗證、授權和加密機制與您通常使用的 Web 應用程序完全相同。如果熟悉 Web 安全性,也就了解了 SOAP 安全性。如果對 Web 應用程序不夠熟悉,本文將為您提供充分的入門知識背景。每個主題都介紹的非常詳細。如果需要更詳細的信息,請參見 MSDN Library 或由 Michael Howard、Marc Levy 和 Richard Waymire 編著的《設計 Microsoft Windows 2000 基於 Web 的安全應用程序》。
重要規則
根據《設計 Microsoft Windows 2000 基於 Web 的安全應用程序》中闡述的觀點,我們首先從概述建立安全 Web 服務應遵守的重要規則開始。安全 Web 服務可歸納為以下七類:
身份驗證
授權
審核
保密
完整性
可用性
認可
身份驗證是一個實體(也稱為主題)驗證另一個實體是否符合它所聲稱的身份的過程。SOAP Toolkit 2.0 支持以下身份驗證方法:
基本
摘要式
Kerberos
Windows NTLM
SSL 客戶端證書
基於 SOAP 頭的身份驗證
代理身份驗證
本文檔介紹如何配置伺服器端和客戶端使用上述身份驗證方法。
授權是為經過身份驗證的用戶提供資源訪問許可權的機制。只要使用 SOAP Toolkit 建立的 Web 服務基於 IIS,這些服務就可以利用 IIS 支持的授權機制。本文檔也將講述用戶應注意的一些問題。
審核的目的是為了收集有關對 Web 服務的成功和失敗請求的信息。可以使用 IIS 審核功能和 SOAP Toolkit 跟蹤功能實現這一目的。本文檔沒有介紹這方面的內容,您可以參考 IIS 文檔、netmon 日誌和 SoapServer 對象的 SOAP Toolkit 幫助。
保密是指確保攻擊者看不到客戶端與伺服器之間的通信信息。完整性是指保護數據不被刪除或更改(不管是惡意還是不慎)的能力。為了實現保密和完整性,SOAP Toolkit 允許使用安全套接字層 (SSL) 加密數據。本文檔將介紹如何啟用 IIS 上的 SSL 支持以及如何將其用於客戶端。
可用性確保不會拒絕合法用戶對請求的資源的訪問。可用性技術的示例包括負載平衡以及硬體和軟體的故障轉移。SOAP Toolkit 已成功通過了 Microsoft Application Center 負載平衡軟體的測試。
認可是一種技術,為發生的操作提供證據以防止客戶端在事務處理中欺詐或否認。SOAP Toolkit 採用 IIS 提供的認可功能。本文檔不對認可進行介紹。
身份驗證
本節介紹了 SOAP Toolkit 支持的身份驗證方法,包括其優點和缺點,以及如何對其進行設置。還介紹了 SOAP Toolkit 在支持平台上的已知局限性,以及伺服器具有多個可用身份驗證方案時 SOAP Toolkit HTTP 連接器的行為。
身份驗證握手是如何進行的?每個身份驗證握手都是如下開始:
客戶端發出頁面請求。
伺服器返回狀態 401「拒絕訪問」和一組 HTTP 頭。
WWW 驗證它支持的每一個身份驗證方法。
如何使用 SoapClient 驗證自身?如果 Web 服務要求身份驗證(基本、摘要式、NTLM 或 Kerberos),需要為 SoapClient 提供用戶名和密碼,以將其傳遞到 Web 服務。也可以使用 SoapClient.ConnectorProperty 包完成此操作:
dim SoapClient
set SoapClient = createobject("MSSoap.SoapClient")
SoapClient.mssoapinit("http://your-server/webservice/service.wsdl ")
SoapClient.ConnectorProperty("AuthName") = "username"
SoapClient.ConnectorProperty("AuthPassword") = "userpwd"
Quote = SoapClient.GetQuote()
注意:使用 SOAP Toolkit 2.0 時,只有在調用遠程方法時才必須設置 SoapClient 上的 ConnectorProperties。
如果包含服務描述的 wsdl 文件所在的虛擬目錄也要求身份驗證,可以在 URL 內傳遞用戶名和密碼:
SoapClient.mssoapinit
("http:// username:userpwd@your-server/webservice/service.wsdl ")
人們往往錯誤地認為將用戶名和密碼放入 URL 是不安全的。事實並非如此。在發送 HTTP 請求之前,客戶端 HTTP 代碼將分析 URL,移出用戶名和密碼,並在身份驗證握手時使用此用戶名和密碼。事實上,代碼:
SoapClient.ConnectorProperty("AuthName") = "username"
SoapClient.ConnectorProperty("AuthPassword") = "userpwd"
Quote = SoapClient.GetQuote()
與下列代碼的功能相同(假設 WSDL 文件 service.wsdl 指向自身):
SoapClient.ConnectorProperty("EndPointURL")=
"http:// username:userpwd@your-server/webservice/service.wsdl"
Quote = SoapClient.GetQuote()
虛擬目錄設置如何要求身份驗證?若要在伺服器上更改特定虛擬目錄的身份驗證設置,請執行下列操作:
在 IIS 4.0 和 IIS 5.0 上,用滑鼠右鍵單擊虛擬目錄,單擊「屬性」,然後單擊「目錄安全性」選項卡。
在「匿名訪問和身份驗證控制」之下,單擊「編輯」。將出現以下兩個選項:
匿名訪問
匿名訪問不是身份驗證方法。Windows 2000 和 NT4 要求用戶在訪問任何資源之前驗證自身,這種情況下,IIS 使用一個特殊帳戶作為匿名 Web 用戶(默認為 IUSR_machinename)。可以單擊「匿名訪問編輯」按鈕更改此默認匿名 Web 用戶的帳戶或其密碼。
注意:小心不要將特權帳戶用作匿名 Web 用戶帳戶。若要將虛擬目錄設置為要求身份驗證,需要清除「匿名訪問」標記。
基本身份驗證
若要將虛擬目錄設置為要求基本身份驗證,需要:
轉至「屬性」/「目錄安全性」/「編輯匿名訪問驗證控制」菜單。
取消選中「匿名訪問」。
啟用「基本身份驗證」。將顯示一條警告消息。如果要繼續使用基本身份驗證,請單擊「確定」。
單擊「基本身份驗證編輯」按鈕。輸入域名。如果要使用默認域名,請輸入「\」(不加引號)。
缺點:基本身份驗證是非常不安全的。用戶名和密碼以不加密的 Base64 編碼形式通過線路傳輸。問題不僅在於攻擊者能訪問基本身份驗證保護的資源,他們還能夠獲取您的用戶名和密碼的實際值,並用來訪問其它更安全的資源。使用 SSL 連接會更安全一些,因為 SSL 握手在身份驗證握手之前發生。這樣,可以通過安全連接傳送用戶名和密碼。
優點:基本身份驗證是 HTTP 1.0 協議的一部分,是得到最廣泛支持的身份驗證方案。
結論:基本身份驗僅當與 SSL 功能共同使用時才是一個好的解決方案。如果希望您的服務具有安全性和高互操作性,請使用本方法。
摘要式身份驗證
這是一個相對較新的方法,是 HTTP1.1 協議的一部分,但沒有被 Web 伺服器廣泛採用。對於 Windows,它只在出現 Windows 2000 之後才被採用。若要在 IIS 5.0 上設置摘要式身份驗證,請執行下列步驟:
轉至「屬性」/「目錄安全性」/「編輯匿名訪問」和「身份驗證控制」菜單。
取消選中「匿名訪問」。
啟用「摘要式身份驗證」。將顯示一條警告消息。如果要繼續使用摘要式身份驗證,請單擊「確定」。
使用摘要式身份驗證具有以下要求:
運行 Windows 2000 Server 的系統位於 Active Directory 域。
在域控制器上安裝 iissuba.dll 文件。該 DLL 在匿名訪問和摘要式身份驗證期間發揮作用。
在 Active Directory 設置中使用摘要式身份驗證的所有帳戶的日誌記錄都啟用「使用可逆加密存儲密碼」選項。這是對 Active Directory 中帳戶密碼的純文本副本進行摘要式身份驗證訪問時所必需的。這樣,可確保存儲這些密碼的伺服器是非常安全的。
缺點:如果摘要式身份驗證不與 SSL 一起使用,將不能保護資源免於重復攻擊。目前尚未在其它 HTTP 客戶端和伺服器中被廣泛採用。在 IIS 5.0 上的實現具有局限性,如果通過摘要式身份驗證登錄到伺服器,標識將無法委派到其它伺服器。這就將伺服器限制為伺服器方案。
優點:摘要式身份驗證簡單,可能會越來越普及。它比基本身份驗證更安全,因為盡管仍可能遭到重復攻擊,但攻擊者無法獲得訪問其它資源所要求的用戶名和密碼的實際值。
結論:摘要式身份驗證可以用於保護通過 Web 服務公開到 Internet 的低價值資源。在 SSL 上使用基本身份驗證可以獲得更好的性能,因為 SSL 速度慢,但不會象基本身份驗證那樣將用戶名和密碼暴露給攻擊者。
6. 如何開發 soap 訪問 部署在aws上的 https服務
現在把完整代碼貼上
-(NSString *) getSOAPXMLString:(NSString *) functionName
Parameter :(NSMutableDictionary * )parameterArray{
NSString * strParameter=@"";
if (parameterArray!=nil) {
NSArray *keys = [parameterArray allKeys];
for (NSString *key in keys) {
//[CommonFunction log:@"%@ is %@",key, [parameterArray objectForKey:key]];
NSLog(@"%@ is %@",key, [parameterArray objectForKey:key]);
strParameter=[strParameter
stringByAppendingFormat:@"<%@>%@</%@>\n",key,[parameterArray
objectForKey:key],key];
}
}
NSString * strBody=@"";
if ([strParameter isEqualToString:@""]) {
strBody=[NSString stringWithFormat:@"<%@ xmlns=\"%@\"/>\n",functionName,xmlns];
}
else {
strBody=[NSString stringWithFormat:@"<%@ xmlns=\"%@\">\n"
"%@"
"</%@>>\n",functionName,xmlns,strParameter,functionName];
}
NSString *soapMessage =[NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<soap:Envelope
xmlns:xsi=\"\"
xmlns:xsd=\"\"
xmlns:soap=\"\">\n"
"<soap:Body>\n"
"%@"
"</soap:Body>\n"
"</soap:Envelope>\n",strBody];
return soapMessage;
}
-(void) getWebServiceFunctionResult:(NSString *) functionName
Parameter :(NSMutableDictionary * )parameterArray
{
webserviceFunctionName=functionName;
self.webserviceFunctionResultName=[functionName stringByAppendingString:@"Result"];
NSString * soapMessage=[self getSOAPXMLString:functionName Parameter:parameterArray];
NSURL *url = [NSURL URLWithString:[webserviceBaseURL stringByAppendingString:@"servicemain.asmx"]];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
[theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
NSString * strFunctionURL=[webserviceBaseURL stringByAppendingString:@"servicemain.asmx"];
//stringByAppendingFormat:@"/",functionName];
NSLog(@"strFunctionURL %@",strFunctionURL);
[theRequest addValue:strFunctionURL forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
theConnection_ = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self] ;
if( theConnection_ )
{
webData = [[NSMutableData data] retain];
}
else
{
NSLog(@"theConnection is NULL");
}
}
#pragma mark -
#pragma mark NSURLConnection delegate
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *HTTPresponse = (NSHTTPURLResponse *)response;
NSInteger statusCode = [HTTPresponse statusCode];
if ( 404 == statusCode || 500 == statusCode ) {
if (delegate) {
[delegate webServiceResultParseComplete:NO webServiceResultString:@""];
}
[connection cancel];
//[connection release];
//[webData release];
} else {
[webData setLength: 0];
NSLog(@"connection: didReceiveResponse:1");
}
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[webData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
@try {
NSLog(@"ERROR with theConenction");
//if (delegate) {
// [delegate webServiceResultParseComplete:NO webServiceResultString:@""];
// }
[connection release];
[webData release];
}
@catch (NSException * e) {
if (self) {
[self release];
}
}
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString
*theXML = [[NSString alloc] initWithBytes: [webData mutableBytes]
length:[webData length] encoding:NSUTF8StringEncoding];
//NSLog(theXML);
[theXML release];
if( xmlParser )
{
[xmlParser release];
}
xmlParser = [[NSXMLParser alloc] initWithData: webData];
[xmlParser setDelegate: self];
[xmlParser : YES];
[xmlParser parse];
[connection release];
//[webData release];
}
-(BOOL)connection:(NSURLConnection *)connection :(NSURLProtectionSpace *)protectionSpace
{
NSLog(@"protectionSpace.authenticationMethod %@",protectionSpace.authenticationMethod);
NSLog(@" %@",);
return [protectionSpace.authenticationMethod isEqualToString:];
}
-(void)connection:(NSURLConnection *)connection :(NSURLAuthenticationChallenge *)challenge
{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:])
// if ([trustedHosts containsObject:challenge.protectionSpace.host])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
[challenge.sender :challenge];
}
7. 求大神分享一份 soapui v5.2.1破解版安裝包
建議不要使用破解版軟體,因為破解版軟體被破解者強行修改了軟體流程,導致軟體很容易出錯,造成系統的不穩定和數據的丟失。另外,很多破解版軟體中還攜帶的有病毒和木馬,在使用破解版軟體的同時帶來其他更大的損失。
我之前有使用過一款破解版的U盤加密軟體 U盤超級加密3000,結果我的數據就丟了,唉!再也不會使用破解版的軟體了。
8. 怎麼給WebService加上安全機制
簡單一些繼承SoapHeader加入賬號密碼之類的,然後使用ssl加密通訊過程也差不多了。
也可以使用客戶端服務端約定使用一個加密key,然後加密webserver的某些或是全部調用參數,別人能看到webserver函數定義,但是不知道加密方式也就沒辦法了,當然最好把當前時間也加密到參數中防止重發攻擊。也可以改進一下,借鑒ssl通訊過程,客戶端生成臨時加密key,然後使用公鑰加密發給服務端,服務端使用私鑰進行解密,然後雙方使用臨時加密key加密通訊參數。
當然你的客戶端程序要混淆一下,或是核心加密過程使用非託管代碼來寫。
9. python 有沒有php裡面的soapclient這樣的東西
SOAP.py 客戶機和伺服器
SOAP.py 包含的是一些基本的東西。沒有 Web 服務描述語言(Web Services Description Language,WSDL)或者任何其它附加的東西,只有用 Python 實現的 SOAP 客戶機和伺服器的透明支持。甚至這個包中的一個很好的功能也只是與基礎架構相關:SOAP.py 支持安全套接字層(SSL)用於加密的 SOAP 傳輸。為使用這個功能,您必須安裝 M2Crypto,M2Crypto 是一個庫,包含各種加密工具和格式,從 RSA 和 DSA 到 HTTPs、S/MIME 等等。在這一部分,我們不準備討論 SOAP.py 的 SSL 支持。
SOAP 操作摘要
目前為止,SOAP 實用程序好象仍是比較流行的使用 Python 的開放源代碼活動。下面是該項目的綱要以及它們目前的狀態。首先,參與者:
4Suite SOAP,由 Fourthought 管理
SOAPy,由 Adam Elman 管理
SOAP.py,Python 項目的一個 Web 服務項目
soaplib,由 Secret Labs 管理
Orchard,由 Ken MacLeod 管理
PySOAP,由 Dave Warner 管理
4Suite SOAP 是我們自己的實現,我們在本專欄的前面三部分中使用過(請參閱 參考資料以獲得它的鏈接)。它目前仍在開發中。
SOAPy 是在 2001 年 4 月公布的,目前處於 alpha 的預備階段,但現在好象停止開發了。
SOAP.py 開發被凍結了。SOAP.py 這個項目是由 actzero 公司贊助的,而 actzero 卻不再從事這一行業了。正在邀請自願開發/維護 SOAP.py 的組織。
soaplib 的開發好象也延緩了,考慮到 Secret Labs 這段時間所承擔的大量工作,或許就可以理解為什麼會這樣了。這個瑞典的公司是由 Fredrik Lundh 掌管的,他在 Python 圈內是出名的「工作狂」,同時也是 Python Association 董事會的一名成員。Secret Labs 還開發 PythonWare(Python 的一個核心和重要的附加模塊);PythonWorks(一個領先的 Python IDE);Python Imaging Library 和許多其它好東西(日常 Python-URL Web 日誌就是其中的一部分)。
Orchard 是一個數據管理框架,基本上是一種用一個公共介面管理不同數據格式的方法。它實現了一個 SOAP 客戶機作為在遠程過程調用中向 SOAP 伺服器發送 Orchard 數據項的基本方法(被稱為節點)。
PySOAP 這個項目主要是想作為 Dave Warner 的 Church 管理套件的一部分,但它還從沒發行過任何文件,好象是一個毫無生氣的項目。
安裝
開始先下載分發包(在寫這篇文章的時候,SOAPpy 0.9.7 是最新的分發包),把文件解包,轉到結果目錄,並把文件 SOAP.py復制到自己傾向的位置。當然,這個「傾向」就是需要技巧的地方。由於這些 SOAP lib 中有很多都使用大小寫組合不同的「soap.py」作為模塊名,所以大家一定要小心。當然,UNIX 用戶只需關心大小寫是否精確匹配,但對於 Windows 用戶來說,甚至「SOAP.py」和「soap.py」之間的沖突也會帶來麻煩。Orchard 的 SOAP.py 也有一個容易發生沖突的名稱,但它有可能避開所有的問題,因為它的模塊聰明地放在了 Orchard 包中。
上面的內容簡言之就是建議您確保安裝所有的 Python SOAP 模塊時都使用與眾不同的包名稱。在我們的案例中,我們在 PYTHONPATH 中發現了一個合適的目錄並創建了一個 WebServices 包,把 SOAP.py 放在了這個包中。因此,在 Linux 中:
$ mkdir ~/lib/python/WebServices
$ touch ~/lib/python/WebServices/__init__.py
$ cp SOAPpy097/SOAP.py ~/lib/python/WebServices
請注意很重要的第二條命令,它將生成一個 __init__.py 文件,這個文件將 WebServices 目錄標志為 Python 包。如果您需要把這些代碼打包成 Windows 版本,您可能希望向空文件中輸入一些注釋,因為一些 Windows 工具不創建空文件。
您已深入主題了
對於公開提供的 SOAP 伺服器,早已經有了好幾個活動的注冊中心。最流行的可能是 XMethods。當然,它也是一個相當有趣的指導,通過它我們可以了解 SOAP 的實際狀況,而不要聽它的吹噓。這里的大多數公共 Web 服務仍然只是一些無關緊要的東西,幾乎不值得我們勇敢的新模型多費口舌,但那是另一回事了。實際上,我們將選擇一個公共服務來演示和測試如何把 SOAP.py 作為 SOAP 客戶機使用。
或者,我們可以試試。作者嘗試的第一個服務,衛生保健提供者定位器,在遇到下列報錯消息時顯示 SOAP 互操作性的當前狀態中的陷阱:
WebServices.SOAP.faultType: <Fault soap:Client:
Server did not recognize the value of
HTTP Header SOAPAction: "".>
哦。SOAPAction 是一個 HTTP 頭,應該是用來標記被訪問服務的。它是 SOAP 請求中必需的頭,但即便是設置了所需的頭(只是一對空的雙引號)後,上面的錯誤仍然存在。作者發現大多數 MS SOAP 實現都存在這個問題。在試遍了這些服務後,我們斷定,Delphi 實現好象與 SOAP.py 合作得最好,但在試服務時 — 即使是用 Delphi 實現時,也返回復雜的類型,比如列表,SOAP.py 無法使用它們,返回不帶數據的 WebServices.SOAP.typedArrayType 實例。
最後,作者選擇了一個相當合適的 Web 服務,該服務返回漫畫《丁丁歷險記》中的人物 Haddock 船長常用的罵人語言(是的,大多數 Web 服務都是這樣)。 清單 1(curse.py)就是這個程序。
清單 1:訪問 Curse 生成器 SOAP 服務的 SOAP.py 程序
#!/usr/bin/env python
import sys
#Import the SOAP.py machinery
from WebServices import SOAP
remote = SOAP.SOAPProxy(
"ck.exe/soap/IHaddock",
namespace="urn:HaddockIntf-IHaddock",
soapaction="urn:HaddockIntf-IHaddock#Curse"
)
try:
lang = sys.argv[1]
except IndexError:
lang = "us"
result = remote.Curse(LangCode=lang)
print "What captain Haddock had to say: "%s""%result
把一切綜合在一起
導入庫後,我們將設置代理對象 remote 。這個對象將方法調用轉換為遠程 SOAP 消息。它的初始化器使用管理遠程請求的關鍵參數: 伺服器的 URI(被稱為「端點」)、請求元素的 XML 名稱空間(通過它,SOAP-as-RPC 將 口頭承諾變成 XML 基礎)和 SOAPAction 頭值。
接下來,我們將確定方法參數,對於這個 Web 服務來說,方法參數只是 Haddock 罵人的語言,瑞典語(「se」)或英語(奇怪的是,是「us」而不是「en」)。
最後,我們調用名稱正確的方法,代理對象的 Curse 進行 SOAP 調用,然後列印出結果。下面的會話演示了對該程序的使用:
$ python curse.py
What captain Haddock had to say: "Ectoplasmic Byproct!"
我們自己的 SOAP 伺服器
用 SOAP.py 實現 SOAP 伺服器相當容易。作為一個示例,我們將仿建欄位,還要實現一個很常見的服務:一個程序,給出年份和月份,它將以字元串的形式列印出日歷。它的程序伺服器是 清單 2(calendar-ws.py)。
清單 2:實現日歷伺服器的 SOAP.py 程序
#!/usr/bin/env python
import sys, calendar
#Import the SOAP.py machinery
from WebServices import SOAP
CAL_NS = "/simple-cal"
class Calendar:
def getMonth(self, year, month):
return calendar.month(year, month)
def getYear(self, year):
return calendar.calendar(year)
server = SOAP.SOAPServer(("localhost", 8888))
cal = Calendar()
server.registerObject(cal, CAL_NS)
print "Starting server..."
server.serve_forever()
進行過必要的導入後,我們為自己的伺服器定義 SOAP 請求元素期望的名稱空間( CAL_NS )。接下來我們定義實現所有方法的類,這些方法將被公開為 SOAP 方法。大家也可以把單個函數作為 SOAP 方法注冊,但使用類方法是最靈活的,特別是當您想管理調用間的狀態時。這個 Calendar 類定義了一個方法 getMonth ,該方法使用 Python 的內置日歷模塊在文本表單中返回月度日歷,同時它還定義了另一個返回整年日歷的方法。
然後創建 SOAP 伺服器框架的一個實例,這個實例還帶有偵聽埠 8888 的指令。我們還必須創建 Calendar 類的一個實例,這個實例在下一行中被注冊用來處理 SOAP 消息,同時為其指出相關的名稱空間。最後,我們調用 serve_forever 方法,該方法直到進程終止才返回。
為運行伺服器,請打開另一個命令 shell 並執行 python calendar-ws.py 。執行結束時使用 ctrl-C 殺死進程。
我們本來可以用也是用 SOAP.py 寫的客戶機測試伺服器,但那太顯而易見了。我們還是用低級 Python 編寫客戶機把 SOAP 響應作為 XML 字元串來構建,並發送一條 HTTP 消息。這個程序(testcal.py)在 清單 3中。
清單 3:用 Python 核心庫寫的訪問日歷服務的客戶機
import sys, httplib
SERVER_ADDR = "127.0.0.1"
SERVER_PORT = 8888
CAL_NS = "ple-cal"
BODY_TEMPLATE = """<SOAP-ENV:Envelope
xmlns:SOAP-ENV="oap/envelope/"
xmlns:s="/ws/simple-cal"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
>
<SOAP-ENV:Body>
<s:getMonth>
<year xsi:type="xsd:integer">%s</year>
<month xsi:type="xsd:integer">%s</month>
</s:getMonth>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>"""
def GetMonth():
year = 2001
month = 12
body = BODY_TEMPLATE%(year, month)
blen = len(body)
requestor = httplib.HTTP(SERVER_ADDR, SERVER_PORT)
requestor.putrequest("POST", "cal-server")
requestor.putheader("Host", SERVER_ADDR)
requestor.putheader("Content-Type", "text/plain; charset="utf-8"")
requestor.putheader("Content reply_body = requestor.getfi-Length", str(blen))
requestor.putheader("SOAPAction", "het/eg/ws/simple-car")
requestor.endheaders()
requestor.send(body)
(status_code, message, reply_headers) = requestor.getreply()
le().read()
print "status code:", status_code
print "status message:", message
print "HTTP reply body:\n", reply_body
if __name__ == "__main__":
GetMonth()
下面的會話演示了這個測試的運行情況。
$ python testcal.py
status code: 200
status message: OK
HTTP reply body:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:SO
AP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<getMonthResponse SOAP-ENC:root="1">
<Result xsi:type="xsd:string"> December 2001
Mo Tu We Th Fr Sa Su
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
</Result>
</getMonthResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
仔細審查的位元組
如果您查找行 self.debug = 0 並把「0」改為「1」(這是 SOAP.py 版本 0.9.7 中的第 210 行),有一件要注意的事情是您可以獲得被交換的實際 SOAP 消息的詳細信息和用於調試與跟蹤的其它關鍵數據,這對您很有用。作為示例,下面提供了一個會話,它是打開了調試信息顯示開關的以前的 curses.py 程序的一個會話:
$ python curse.py
*** Outgoing HTTP headers **********************************************
POST /scripts/Haddock.exe/soap/IHaddock HTTP/1.0
Host: www.tankebolaget.se
User-agent: SOAP.py 0.9.7 (actzero.com)
Content-type: text/xml; charset="UTF-8"
Content-length: 523
SOAPAction: "urn:HaddockIntf-IHaddock#Curse"
************************************************************************
*** Outgoing SOAP ******************************************************
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:SO
AP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:Curse xmlns:ns1="urn:HaddockIntf-IHaddock" SOAP-ENC:root="1">
<LangCode xsi:type="xsd:string">us</LangCode>
</ns1:Curse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
************************************************************************
*** Incoming HTTP headers **********************************************
HTTP/1.? 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 11 Sep 2001 16:40:19 GMT
Content-Type: text/xml
Content-Length: 528
Content:
************************************************************************
*** Incoming SOAP ******************************************************
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xml
soap.org/soap/encoding/"><SOAP-ENV:Body><NS1:CurseResponse xmlns:NS1="urn:HaddockIntf-
IHaddock" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><NS1:return
xsi:type="xsd:string">Anacoluthons!</NS1:return></NS1:CurseRespon
se></SOAP-ENV:Body></SOAP-ENV:Envelope>
************************************************************************
What captain Haddock had to say: "Anacoluthons!"
為進行比較,您可以在帶有下列代碼的舊的 Python 腳本或程序中獲得相同的信息:
import calendar
return calendar.month(2001, 10)
SOAP.py 總結
我們已經注意到了,雖然 SOAP.py 的互操作性還存在一些問題,但可用的調試工具可望提供幫助。