WebserviceWebservice是使應(yīng)用程序以與平臺(tái)和編程語言無關(guān)的方式進(jìn)行相互通信技術(shù)。 eg:站點(diǎn)提供訪問的數(shù)據(jù)接口:新浪微博、淘寶。 官方解釋:它是一種構(gòu)建應(yīng)用程序的普遍模型,可以在任何支持網(wǎng)絡(luò)通信的操作系統(tǒng)中實(shí)施運(yùn)行;它是一種新的web應(yīng)用程序分支,是自包含、自描述、模塊化的應(yīng)用,可以發(fā)布、定位、通過web調(diào)用。WebService是一個(gè)應(yīng)用組件,它邏輯性的為其他應(yīng)用程序提供數(shù)據(jù)與服務(wù).各應(yīng)用程序通過網(wǎng)絡(luò)協(xié)議和規(guī)定的一些標(biāo)準(zhǔn)數(shù)據(jù)格式(Http,XML,Soap)來訪問WebService,通過WebService內(nèi)部執(zhí)行得到所需結(jié)果.Web Service可以執(zhí)行從簡單的請求到復(fù)雜商務(wù)處理的任何功能。一旦部署以后,其他WebService應(yīng)用程序可以發(fā)現(xiàn)并調(diào)用它部署的服務(wù)。
SOAP(Simple Object Access Protocol):簡單對象訪問協(xié)議是在分散或分布式的環(huán)境中交換信息并執(zhí)行遠(yuǎn)程過程調(diào)用的輕量級(jí)協(xié)議,是一個(gè)基于XML的協(xié)議。使用SOAP,不用考慮任何特定的傳輸協(xié)議(最常用的還是HTTP協(xié)議),可以允許任何類型的對象或代碼,在任何平臺(tái)上,以任何一種語言相互通信。 WSDL:Web Services Description Language的縮寫,是一個(gè)用來描述Web服務(wù)和說明如何與Web服務(wù)通信的XML語言。為用戶提供詳細(xì)的接口說明書。 Axis:Axis本質(zhì)上就是一個(gè)SOAP引擎(Apache Axis is an implementation of the SAOP),提供創(chuàng)建服務(wù)名、客戶端和網(wǎng)關(guān)SOAP操作的基本框架。但是Axis并不完全是一個(gè)SOAP引擎,它還包括:
Axis有四種Service styles,分別是:
WSDD(Web Service Deployment Descriptor):Web服務(wù)分布描述,它定義了Web服務(wù)的接口,如服務(wù)名、提供的方法、方法的參數(shù)信息。 UDDI(Universal Description,Discovery,and Integration):統(tǒng)一描述、發(fā)現(xiàn)和集成,用于集中存放和查找WSDL描述文件,起著目錄服務(wù)器的作用。
WSDL元素WSDL元素基于XML語法描述了與服務(wù)進(jìn)行交互的基本元素: Type(消息類型):數(shù)據(jù)類型定義的容器,它使用某種類型系統(tǒng)(如XSD)。 Message(消息):通信數(shù)據(jù)的抽象類型化定義,它由一個(gè)或者多個(gè)part組成。 Part:消息參數(shù) Operation(操作):對服務(wù)所支持的操作進(jìn)行抽象描述,WSDL定義了四種操作:
Port Type (端口類型):特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范。 Binding:特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范 Port :定義為綁定和網(wǎng)絡(luò)地址組合的單個(gè)端點(diǎn)。 Service:相關(guān)端口的集合,包括其關(guān)聯(lián)的接口、操作、消息等。
以上類圖表達(dá)了Service、Port、Binding、Operation、Message之間的依賴、關(guān)聯(lián)、聚合、合成、泛化、實(shí)現(xiàn),這里暫不多說,若感興趣,請參考該文章 UML類圖關(guān)系大全: http://www.cnblogs.com/riky/archive/2007/04/07/704298.html WSDL偽代碼WSDL 文檔是利用這些主要的元素來描述某個(gè) web service 的: 元素 定義 web service 執(zhí)行的操作 <message> web service 使用的消息 <types> web service 使用的數(shù)據(jù)類型 <binding> web service 使用的通信協(xié)議 一個(gè) WSDL 文檔的主要結(jié)構(gòu)是類似這樣的: <definitions> <types> definition of types........ </types> <message> definition of a message.... </message> <portType> definition of a port....... </portType> <binding> definition of a binding.... </binding> </definitions>
WSDL 文檔可包含其它的元素,比如 extension 元素,以及一個(gè) service 元素,此元素可把若干個(gè) web services 的定義組合在一個(gè)單一的 WSDL 文檔中 實(shí)踐為了形成鮮明的對比,客戶端用CS架構(gòu)來創(chuàng)建客戶端。 實(shí)踐之一:創(chuàng)建服務(wù)端創(chuàng)建ASP.NET Web服務(wù)
代碼示例using System; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using DotNet.Model; [WebService(Namespace = "http:///")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // 若要允許使用 ASP.NET AJAX 從腳本中調(diào)用此 Web 服務(wù),請取消對下行的注釋。 // [System.Web.Script.Services.ScriptService] public class Service : System.Web.Services.WebService { public Service () { //如果使用設(shè)計(jì)的組件,請取消注釋以下行 //InitializeComponent(); } [WebMethod(Description="獲取字符串",MessageName="HelloWorld")] public string HelloWorld() { return "Hello World"; } [WebMethod(Description="獲取用戶信息",MessageName="getCustomer")] public Customer getCustomer(Customer cus1) { return cus1; } [WebMethod(Description = "獲取用戶信息以參數(shù)形式", MessageName = "getCustomerFromParams")] public Customer getCustomerFromParams(int id, string name, string address) { Customer cus1 = new Customer(); cus1.cus_id = id; cus1.cus_name = name; cus1.cus_address = address; return cus1; } }
實(shí)踐之二:創(chuàng)建客戶端創(chuàng)建ASP.NET WEB客戶端(以CS架構(gòu))
代碼示例 (其中一種方式通過創(chuàng)建“服務(wù)引用”的方式,輸入“http://localhost: 端口號(hào)/XX.asmx?wsdl”方式,獲得服務(wù)訪問接口) private ServiceReference1.ServiceSoapClient myclient = new ServiceReference1.ServiceSoapClient(); private void button1_Click(object sender, EventArgs e) { try { /* 第一種方式可以傳參、傳實(shí)體,返回實(shí)體 */ ServiceReference1.ServiceSoapClient myclient = new ServiceReference1.ServiceSoapClient(); ServiceReference1.Customer tem = new ServiceReference1.Customer(); tem.cus_id = int.Parse(textBox1.Text); tem.cus_name = textBox2.Text; tem.cus_address = textBox3.Text; string str = JsonHelper.Jso_ToJSON(myclient.getCustomer(tem)); richTextBox1.Text = str; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button2_Click(object sender, EventArgs e) { richTextBox1.Text = string.Empty; try { richTextBox1.Text = myclient.HelloWorld(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button4_Click(object sender, EventArgs e) { try { /* 第二種方式可以傳參,返回實(shí)體(不能傳入一個(gè)對象實(shí)體,但是配置動(dòng)態(tài)靈活) */ string url = "http://localhost:3199/ServicePort/Service.asmx"; string methodname = "getCustomerFromParams"; object[] obj = new object[3]; obj[0] = int.Parse(textBox1.Text); obj[1] = textBox2.Text; obj[2] = textBox3.Text; string str = JsonHelper.Jso_ToJSON(WebServiceHelper.InvokeWebService(url, methodname, obj)); richTextBox1.Text = str; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button5_Click(object sender, EventArgs e) { try { /* 第三種方式可以傳參、傳實(shí)體,返回XmlDom(配置動(dòng)態(tài)靈活,響應(yīng)處理麻煩了點(diǎn)而已) */ string url = "http://localhost:3199/ServicePort/Service.asmx"; string methodname = "getCustomer"; Hashtable parm = new Hashtable(); string objectName = "cus1"; parm["cus_id"] = int.Parse(textBox1.Text); parm["cus_name"] = textBox2.Text; parm["cus_address"] = textBox3.Text; XmlDocument oo = WebServiceXmlHelper.QuerySoapWebServiceByObject(url, methodname, objectName, parm); richTextBox1.Text = oo.InnerXml; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
運(yùn)行效果服務(wù)端
WSDL
客戶端(支持多平臺(tái),如Java、.Net等)第1種方式:傳參、傳實(shí)體,URL配置缺少靈活,數(shù)據(jù)處理靈活
第2種方式:傳參,不能傳實(shí)體,URL配置靈活, 數(shù)據(jù)處理要稍微加工
第3種方式:傳參、傳實(shí)體、URL配置靈活,數(shù)據(jù)處理要稍微加工
小結(jié)
HTTP POST 以下是 HTTP POST 請求和響應(yīng)示例。所顯示的占位符需替換為實(shí)際值。 POST /ServicePort/Service.asmx/getCustomerFromParams HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: length id=string&name=string&address=string
返回接收串 HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <Customer xmlns="http:///"> <cus_id>int</cus_id> <cus_name>string</cus_name> <cus_address>string</cus_address> </Customer>
POST /ServicePort/Service.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./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema" xmlns:soap12="http://www./2003/05/soap-envelope"> <soap12:Body> <getCustomerFromParams xmlns="http:///"> <id>int</id> <name>string</name> <address>string</address> </getCustomerFromParams> </soap12:Body> </soap12:Envelope>
返回接收串: 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./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema" xmlns:soap12="http://www./2003/05/soap-envelope"> <soap12:Body> <getCustomerFromParamsResponse xmlns="http:///"> <getCustomerFromParamsResult> <cus_id>int</cus_id> <cus_name>string</cus_name> <cus_address>string</cus_address> </getCustomerFromParamsResult> </getCustomerFromParamsResponse> </soap12:Body> </soap12:Envelope>
WebService向外發(fā)布接口的功能,能夠更好的為其它平臺(tái)提供數(shù)據(jù)以及現(xiàn)實(shí)信息平臺(tái)一體化。 本文下載: 淺淡Webservice、WSDL三種服務(wù)訪問的方式.doc 源代碼下載: http://files.cnblogs.com/yongfeng/001DotNetWebService.rar 參考網(wǎng)站: http://www./TR/wsdl
|
|