❶ 如何用c#編寫發送soap請求的客戶端
1條回答
假設A是客戶端,B是webservice服務端,用戶通過http協議向伺服器發送soap請求,webservice返回客戶端XML格式的數據。
現在我們看一看創建一個webservice的大致過程:
服務端的webservice是必須要建的。中間的soap,xml我們不用去關心,在客戶端這邊,比較重要的是如何從webservice取得對象?答案是用的是proxy對象。客戶端由代理對象(proxy)負責與webservice的通信。所以在客戶端使用webservice,完全和使用一個本地對象是一樣的。
在客戶端右鍵單擊右邊的reference(引用),選擇」添加引用」,選擇瀏覽,找到webserver目錄下的bin目錄下的webserver.dll
再加入一個system.web.webservices的引用,在列表中有。
在form1.cs里,加入
using System.Web.Services;
using webserver;
❷ 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 的互操作性還存在一些問題,但可用的調試工具可望提供幫助。
❸ soapui是什麼工具
pyright © 1999-2020, CSDN.NET, All Rights Reserved
搜索博文/帖子/用戶
登錄
海藍曉林
關注
soapUI工具使用方法、簡介、介面測試 轉載
2018-10-17
海藍曉林
碼齡5年
關注
soapUI工具使用方法、簡介、介面測試
一、soapUI簡介
SOAP:
WebService通過Http協議發送請求和接收結果時,發送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP消息頭,以說明HTTP消息頭的內容格式,這些特定的HTTP消息頭和XML內容格式就是SOAP協議。SOAP提供了標準的RPC方法來調用WebService。
SOAP協議 = HTTP協議 + XML數據格式
SOAP協議定義了SOAP消息的格式,SOAP協議是基於HTTP協議的,SOAP也是基於XML和XSD的,XML是SOAP的數據編碼方式。打個比喻:HTTP就是普通公路,XML就是中間的綠色隔離帶和兩邊的防護欄,SOAP就是普通公路經過加隔離帶和防護欄改造過的高速公路。
WSDL:
好比我們去商店買東西,首先要知道商店裡有什麼東西可買,然後再來購買,商家的做法就是張貼廣告海報。 WebService也一樣,WebService客戶端要調用一個WebService服務,首先要有知道這個服務的地址在哪,以及這個服務里有什麼方法可以調用,所以,WebService務器端首先要通過一個WSDL文件來說明自己家裡有啥服務可以對外調用,服務是什麼(服務中有哪些方法,方法接受的參數是什麼,返回值是什麼),服務的網路地址用哪個url地址表示,服務通過什麼方式來調用。
WSDL(Web Services Description Language)就是這樣一個基於XML的語言,用於描述Web Service及其函數、參數和返回值。它是WebService客戶端和伺服器端都能理解的標准格式。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應WebService的代理類代碼。
WSDL文件保存在Web伺服器上,通過一個url地址就可以訪問到它。客戶端要調用一個WebService服務之前,要知道該服務的WSDL文件的地址。WebService服務提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊到UDDI伺服器,以便被人查找;2.直接告訴給客戶端調用者。
WebService的工作調用原理:對客戶端而言,我們給這各類WebService客戶端API傳遞wsdl文件的url地址,這些API就會創建出底層的代理類,我調用這些代理,就可以訪問到webservice服務。代理類把客戶端的方法調用變成soap格式的請求數據再通過HTTP協議發出去,並把接收到的soap數據變成返回值返回。對服務端而言,各類WebService框架的本質就是一個大大的Servlet,當遠程調用客戶端給它通過http協議發送過來soap格式的請求數據時,它分析這個數據,就知道要調用哪個java類的哪個方法,於是去查找或創建這個對象,並調用其方法,再把方法返回的結果包裝成soap格式的數據,通過http響應消息回給客戶端。
❹ 急啊!c#怎麼通過SOAP調用伺服器的方法,已經知道方法名
把你的方法發布成web service,
然後客戶端引用這個就行了。
手工引用比較麻煩,要用wsdl.exe生成web service的代理類,
你就用vs.net中的 引用web方法就行了,它會幫你搞定的。
❺ 如何在Eclipse中自動生成WebService代理類
1.工具:eclipse3.3或者是帶有webservice插件的eclipse
2. 首先用瀏覽器訪問webservice的站點,接著保存打開的頁面,後綴為.wsdl。
3.把保存好的文件拷入eclipse的工程中。
4.eclipse:file----new---other----webservice----web service client,選擇之前拷貝到eclipse中的.wsdl文件,點擊finish.
這樣eclipse就幫我們自動生成了web service的客戶端,接下來只需在程序中調用即可。
在程序中調用eclipse自動生成的web service客戶端:
String endpoint = "伺服器的webservice地址";
YourWebServiceNameProxy ywsnp = new YourWebServiceNameProxy ();
ywsnp.xxx方法(入參);
如:
String enpoint = "ipTranslatorWebService.asmx?wsdl";
TranslatorWebServiceSoapProxy translatorWebServiceSoapProxy = new TranslatorWebServiceSoapProxy();
String[] result =translatorWebServiceSoapProxy.getEnCnTwoWayTranslator("貓");
❻ java中wsdl文件怎麼生成
原則上,你可以先把JAVA生成.net的文件,然後根據以下其中一個方法,轉變為WSDL
在.NET中有三種方式生成WSDL:
1.在Web Service的URL後面加上WDSL需求,如下:
http://localhost/webExamples/simpleService.asmx?WSDL
2.使用disco.exe。在命令行中寫下如下的命令:
disco http://localhost/webExamples/simpleService.asmx
3.使用System.Web.Services.Description命名空間下提供的類
每個 WSDL 文件的根元素都是 <definitions>,必須在其中提供服務的完整描述。首先,必須在 <definitions> 元素中提供各種名稱空間的聲明。
<definitions> 元素包含一個或多個 < portType > 元素,每個元素都是一系列 operation。可以將單個portType元素看作是將各種方法組成類的一個邏輯分組。應該將每個Types稱為服務,因此整個 WSDL 文件將成為一個服務集合。
在每個服務內可以有幾個方法或者 operation,WSDL 通過 <operation> 元素來引用它們。
下面是一個最簡單的WSDL例子
<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="MobilePhoneService"
targetNamespace="www.mobilephoneservice.com/MobilePhoneService-interface"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.mobilephoneservice.com/MobilePhoneService"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<portType name="MobilePhoneService_port">
<operation name="getListOfModels ">
.......
.......
</operation>
<operation name="getPrice">
.......
.......
</operation>
</portType>
</definitions>
❼ 如何非同步調用webservice,非同步調用有什麼優勢
方法有兩種:
(1)Begin/End方法(雖然被丟棄)。
(2)事件驅動方法。
下面來具體談談這兩種方法;
1、Begin/End方法
使用 Begin/End 模式實現進行非同步方法調用的 Web 服務客戶端
客戶端如何知道何時調用 End 方法呢?根據 .NET Framework 的定義,有兩種方法可以使客戶端確定這一點:
客戶端調用方式1等待方法:使用 WaitHandle 類的方法之一使客戶端等待方法完成。
客戶端調用方式2回調方法:向 Begin 方法傳遞一個回調函數,在該方法完成處理後再調用該函數來檢索結果。
注意:無論客戶端選擇兩種方法中的哪一種與 Web 服務進行非同步通信,收發的 SOAP 消息都與通過同步代理方法生成的 SOAP 消息相同。也就是說,仍然只有一個 SOAP 請求和 SOAP 響應通過網路發送和接收。代理類通過使用與客戶端調用 Begin 方法時使用的線程不同的線程來處理 SOAP 響應,從而實現該目的。因此,在代理類接收和處理 SOAP 響應時,客戶端可以在其線程上繼續執行其他工作。
webservice代碼:
非同步出來的新線程,.NET也是不允許的,所以別想鑽空子,下面可以很容易想到,回收分為2種情況:主動回收和被動回收,主動回收就是,去監視那個線程,並且等待,當非同步方法完成了,就把非同步線程回收,焦點回歸主線程,BeginInvoke之後又EndInvoke,如果在EndInvoke的時候,該非同步線程沒有完成操作,那麼整個程序,包括主線程,又在阻塞了,又會出現界面的情況。要想解決這個問題,就使用「被動回收」方式,其中一個重要的辦法就是「非同步回調」。 核心有二: A、 用回調函數,非同步結束後,自動調用此回調函數。 B、 而不在主線程中手工等待非同步結束,如上兩例中在主線程中調用EndInvoke。此種方法,是在回調函數中調用EndInvoke的。
❽ VB通過SoapClient調用WS,怎麼設置超時
我們都知道,調用WS可以在工程中添加對WS的WEB引用。
但是,如果我們不想通過添加引用的方式,而是在代碼中動態引用該怎麼辦呢看
首先,我們該想到WS的實現也是一個類的形式。
其次,WS在傳輸過程中是通過WSDL來進行描述的(使用SOAP協議)。
因此,我們需要獲取WS的WSDL描述,並通過該描述來動態生成程序集。
最後:通過反射來獲取新生成的程序集,並調用其方法!
上述步驟需要引用如下四個名稱空間:
using System.Web.Services.Description; //WS的描述
//以下幾個用於根據描述動態生成代碼並動態編譯獲取程序集
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
上述幾個名稱空間中包括如下幾個重要的類:
using System.Web.Services.Description下:
ServiceDescription //WS描述
ServiceDescriptionImporter //通過描述生成客戶端代理類,特別注意其中的Style
以下是MSDN對其的描述:
XML Web services 的介面通常由 Web 服務描述語言 (WSDL) 文件來說明。例如,若要獲取有關使用 處公開的 ASP.NET 的 Web 服務的 WSDL 說明,只需導航到 ?WSDL。使用 ServiceDescriptionImporter 類可以方便地將 WSDL 說明中包含的信息導入到System.CodeDom.CodeCompileUnit 對象。通過調整 Style 參數的值,可以指示 ServiceDescriptionImporter 實例生成客戶端代理類(通過透明調用該類可提供 Web 服務的功能)或生成抽象類(該類封裝 Web 服務的功能而不實現該功能)。如果將 Style 屬性設置為 Client,則 ServiceDescriptionImporter 生成客戶端代理類,通過調用這些類來提供說明的 Web 服務的功能。如果將Style 屬性設置為 Server,則 ServiceDescriptionImporter 實例生成抽象類,這些類表示所說明的 XML Web services 的功能而不進行實現。然後,可以通過編寫從這些抽象類繼承的類來對其進行實現,並實現相關的方法。
using System.CodeDom下:
CodedomUnit //它用於設定動態代碼的名稱空間,類名等,可以通過ServiceDescriptionImporter.Import()方法將WS的描述代碼寫入該類,以作動態編譯用
using System.CodeDom.Compiler下:
CodedomProvider //用於創建和檢索代碼生成器和代碼編譯器的實例,我們主要用到其實現子類CShareCodeProvider
可以直接用CShareCodeProvider provider=new CShareCodeProvider()來生成,或者用CodedomProvider.CreateProvider("CSharp")來生成
ICodeCompiler //用於編譯基於 System.CodeDom 的源代碼表示形式。
它通過CodedomProvider的CreateCompiler()方法來
CompilerResults //表示從編譯器返回的編譯結果。 它由ICodeCompiler根據指定的編譯器設置從指定的 CodeCompileUnit 所包含的 System.CodeDom 樹中編譯程序集並返回。CompiledAssembly 屬性指示編譯的程序集。
了解如上信息後,就可動態調用WS了。
❾ 如何在SOAP協議中設置參數風格 詳細�0�3
對於使用 ASP.NET 創建的 XML Web services 和它們的使用 SOAP 與 XML Web services 方法進行通訊的客戶端來說,一個復雜的機制可以用來控制發送到伺服器和從伺服器接收的 SOAP 消息的格式。SOAP 規定發送到 XML Web services 和從 XML Web services 發送回的 SOAP 消息的內容必須為 XML 格式。但是,它並沒有嚴格地規定 XML 的格式設置。為了提供一個使用接收不同的格式設置的 XML Web services 的機制,ASP.NET 提供了一個基於屬性的機制來控制 SOAP 消息中 XML 的格式。另外,還提供了指定特定元素和通過網路發送的 SOAP 屬性名的基於屬性的機制,用來在更精細的細節級別上控制 SOAP。 使用 ASP.NET 創建的 XML Web services 和它們的客戶端之間的通訊在很大程度上是由兩個行業標准規范的:SOAP 和 Web 服務描述語言 (WSDL)。SOAP 為出現在 Body 元素下的數據定義格式設置方案,並為如何在 Body 元素中對參數進行格式設置定義格式設置方案。WSDL 用於描述 XML Web services 所需的 SOAP 消息,WSDL 允許 XML Web services 聲明它們接受帶有編碼參數的 RPC 消息,但它還定義了兩個其他術語:Literal 和 Document。Literal(與 Encoded 類似)是指參數的格式設置方式。Document(與 RPC 類似)是指全部 Body 元素的格式設置方式。 下表概述了使用 ASP.NET 創建的 XML Web services 支持的格式設置樣式以及完成每個特定組合的屬性。帶有 Service 後綴的屬性可以應用於實現 XML Web services 的類以設置該類中 XML Web services 方法的默認格式設置樣式。帶有 Method 後綴的屬性只能應用於 XML Web services 方法或調用 XML Web services 方法的代理類中的方法。每個組合的詳細信息在下表中都有所介紹。 SOAP Document SOAP RPC SOAP SOAP 7 Literal — XSD SoapDocume ntMethod SoapDocume ntService Use=Litera Encoded - SOAP 5 SoapDocume ntMethod SoapDocume ntService Use=Encode d SoapRpcMethod SoapRpcService 設計 XML Web services 時首先要作出的決定之一就是您要如何對 SOAP 請求中的 XML 進行編碼。明確地說,您是要 XML 文檔嚴格遵循 XSD 架構還是要遵循 SOAP 規范第 5 節和第 7 節中概述的格式設置規則?SOAP 規范第 5 節和第 7 節中的格式設置規則考慮到了變體。這樣,使用 SOAP 編碼規則的 SOAP 請求的接收方必須處理所有可能的變體。通過定義 XML Web services 方法的 XSD 架構,可以具體地定義 SOAP 請求中需要發送的確切內容。使用 ASP.NET 創建的 XML Web services 默認為使用基於架構傳遞的文檔。 因為 XML Web services 方法的參數可以組成 SOAP 請求或響應中傳遞的大部分數據,所以參數映射到 XML 元素的方式決定了 XML 文檔的外觀。Web 服務描述語言 (WSDL) 定義了兩種參數格式設置樣式:Encoded 和 Literal。Encoded 是指使用 SOAP 規范第 5 節中概述的 SOAP 編碼對參數進行格式設置。Literal 是指使用 l 這是默認值。 每個參數預定義的 XSD 架構將參數映射到 XML 元素。使用 XML Web services 客戶端,您可以選擇如何將參數映射到 XML 元素以匹配 XML Web services 需要的形式。使用 ASP.NET 創建的 XML Web services 支持 Literal 和 Encoded 兩種參數格式設置樣式。該支持根據 XML Web services 方法格式設置選擇有所變化。 請注意,雖然 ASP.NET 提供了一個廣泛的結構用來控制 XML 格式設置的方式,但是並不保證參數序列化的順序。 我們可以寫一個WebService 例子來說明這一點: testSoapParam.asmx: using System; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Services.Description; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using System.Data; public class testEncoded : WebService { [ SoapDocumentMethod(Use=SoapBindingUse.Encoded ,ParameterStyle=SoapParameterStyle.Bare) ] //參數風格為:Encoded 並且是Bare [WebMethod()] public struct1 testStructBareEncode(struct1 a){ return a; } [ SoapDocumentMethod(Use=SoapBindingUse.Encoded ) ]// 參數風格為:Encoded [WebMethod()] public struct1 testStructEncoded(struct1 a){ return a; } [ SoapDocumentMethod(Use=SoapBindingUse.Literal ) ]//參數風格為:Literal [WebMethod()] public struct1 testStructLiteral(struct1 a){ return a; } [ SoapDocumentMethod(ParameterStyle=SoapParamet erStyle.Bare) ]// 參數風格為:Bare [WebMethod()] public struct1 testStructBare(struct1 ddd){ return ddd; } } public class struct1{ public int i=1; public string j="ok"; public struct2 s2; private struct2 temp; public struct2 s4{ get{ return temp; } set{ temp=value; } } } public class struct2{ public String sField; } 當我們運行客戶端代理請求SOAP 協議時,我們可以發現不同的參數風格有很大的區別,如使用Literal(默認)和Default 時,SOAP 協議客戶端傳輸給服務端的XML 內容為: //參數名字 intstringstringstring 而使用Encoded 時, SOAP 協議客戶端傳輸給服務端的XML 內容為: //a 為參數名,id 號指出該對象是復雜類型,並為鏈路 intstringstringstring 我們可以發現Encoded 時,SOAP 協議把對象和數組作為復雜類型同其他區分開來,並明確的指明每一個類型的名字。 如果是設置為Bare, SOAP 協議客戶端傳輸給服務端的 XML 內容為: //dd 為參數名 intstringstringstring 我們將它與上面(如果不設置Bare,默認為wrapped)進行比較可以發現它少了一層。 而如果我們將Encoded 和Bare 一起來控制參數時,傳輸內容變成: //第一個參數 intstringstringstring 我們可以發現不僅少一層,而且id 號也變了。 我們不僅可以改變SOAP 協議參數傳輸的框架,也可以改變具體每一個元素的值,如:[XmlElement()]可以指定元素的名字和名字空間(namespace),如果指定了([ return: XmlElement("ReturnValueElement",IsNullable=fals e)] 和 [XmlElement("MyAddressElement")),則傳輸的內容變成: //指定的元素名字。 intstringstringstring 總之,我們可以根據XML 的序列化來控制SOAP 消息生成XML 內容的形式。
❿ c# webService 自定義soap頭急急急
GFCSoapHeader是個類名,通過反射獲取屬性應該用屬性名吧
public GFCSoapHeader SoapHeader
{
get
{return mySoapHeader;}
set
{mySoapHeader=value;}
}
PropertyInfo infor = agent.GetType().GetProperty("SoapHeader");
這樣行嗎