http://wenku.baidu.com/view/e4832e32eefdc8d376ee32a8.html?re=view
Web Service 的基本概念
Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。是:通過SOAP在Web上提供的軟件(服務),使用WSDL文件進行(說明),並通過(UDDI)進行注冊。
XML:(Extensible Markup Language)擴展型可標記語言。面向短期的臨時數據處理、面向萬維網絡,是Soap的基礎。
Soap:(Simple Object Access Protocol)簡單對象存取協議。是XML Web Service 的通信協議。當用戶通過UDDI找到你的WSDL描述文檔后,他通過可以SOAP調用你建立的Web服務中的一個或多個操作。SOAP是XML文檔形式的調用方法的規范,它可以支持不同的底層接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一個 XML 文檔,用於說明一組 SOAP 消息以及如何交換這些消息。大多數情況下由軟件自動生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新項目。在用戶能夠調用Web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件,UDDI是一種根據描述文檔來引導系統查找相應服務的機制。UDDI利用SOAP消息機制(標准的XML/HTTP)來發布,編輯,瀏覽以及查找注冊信息。它采用XML格式來封裝各種不同類型的數據,並且發送到注冊中心或者由注冊中心來返回需要的數據。
概念補充:
http:是一個客戶端和服務器端請求和應答的標准(TCP)。http協議其目的是為了提供一種發布和接收htttp頁面的方法
一http協議的客戶端與服務器的交互:由HTTP客戶端發起一個請求,建立一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監聽客戶端發送過來的請求。一旦收到請求,服務器(向客戶端)發回一個狀態行,比如"HTTP/1.1 200 OK",和(響應的)消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。
soap 協議:它描述了一種在分散或分布式的環境中如何交換信息的輕量級協議。soap在http協議的基礎上,一個基於XML的協議。
不同:都是底層的通信協議,請求包的格式不同而已,soap包是XML格式,http純文本格式。
關系:SOAP是個通信協議, SOAP在HTTP協議的基礎上,把編寫成XML的REQUEST參數, 放在HTTP BODY上提交個WEB SERVICE服務器(SERVLET,ASP什么的) 處理完成后,結果也寫成XML作為RESPONSE送回用戶端, 為了使用戶端和WEB SERVICE可以相互對應,可以使用WSDL作為這種通信方式的描述文件,利用WSDL工具可以自動生成WS和用戶端的框架文件,SOAP具備把復雜對象序列化捆綁到XML里去的能力。
Membrane SOAP Monitor,這個soap監聽工具。這是德國的一家在線web服務注冊公司predic8做的開源soap監聽工具,簡單好用。
windows下最新的版本為1.1.2版,下載地址:
http://mirror.predic8.com/membrane/monitor/win86/membrane-monitor-win86-1.1.2.zip
還有linux下的版本:http://download.predic8.com/membrane/monitor/linux-x86/membrane-monitor-linux-x86-0.9.4.tgz
源碼:http://download.predic8.com/membrane/monitor/src/membrane-monitor-src-0.9.4.zip
具體使用:
1) 運行exe文件(linux下可能是jar文件);
2) 點擊菜單項membrane->add rule ,進入后默認選項即可,點next;
3) 設置端口號(不產生沖突的任意端口),點next;
4) 設置主機及端口(部署服務的地址及服務器的端口),完成。
當調用網上發布的服務時,如檢查qq是否在線的服務:
http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
可將4)中的host設為遠端服務的網址,如www.webxml.com.cn,端口設為服務的端口,上面就是80端口。
當我們監聽soap消息時,只要訪問了web服務,即可在membrane的界面顯示發送及接受的soap消息
概念補充:
XML Web Service的特點
二、Web Service開發
.net平台內建了對Web Service的支持,包括Web Service的構建和使用。與其它開發平台不同,使用.net平台,你不需要其他的工具或者SDK就可以完成Web Service的開發了。.net Framework本身就全面支持Web Service,包括服務器端的請求處理器和對客戶端發送和接受SOAP消息的支持。下來我們就一步一步的用Microsoft Visual Studio .net 20058(后面簡稱VS.Net 2008)創建和使用一個簡單的Web Service。
2.1、用創建一個最簡單的Web Service
首先,打開VS2005,打開"文件-新建-網站",選擇"ASP.NET Web服務"
查看Service.cs代碼,你會發現VS.Net 2005已經為Web Service文件建立了缺省的框架。原始代碼為:
|
默認工程里面已經有一個Hello World的方法了,
namespace WebService1 { /// <summary> /// Service1 的摘要說明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] //用於向 XML Web services 添加附加信息,如描述其功能的字符串。 //對於將要發布和執行的 XML Web services 來說,WebServiceAttribute 不是必需的。 //可以使用 WebServiceAttribute 為 XML Web services 指定不受公共語言運行庫標識符(用於 XML Web services 的“服務說明”和“服務幫助”頁)規則限制的名稱。 //XML Web services 在成為公共之前,應該更改其默認的 XML 命名空間。 //每個 XML Web services 都需要唯一的 XML 命名空間來標識它,以便客戶端應用程序能夠將它與網絡上的其他服務區分開來。http://tempuri.org/ 可用於正在開發中的 XML Web services, //但是已發布的 XML Web services 應該使用更具永久性的命名空間。例如,可以將公司的 Internet 域名作為 XML 命名空間的一部分。 //雖然很多 XML Web services 的 XML 命名空間與 URL 很相似,但是,它們無需指向 Web 上的某一實際資源。(XML Web services 的 XML 命名空間是 URI。)對於使用 ASP.NET 創建的 XML Web services,可以使用 Namespace 屬性更改默認的 XML 命名空間。
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]//ConformsTo 獲取或設置綁定聲稱所符合的 Web 服務互操作性 (WSI) 規范。
//聲明定義一個或多個 XML Web services 方法的綁定。無法繼承此類。 //按 Web 服務描述語言 (WSDL) 的定義,綁定類似於一個接口,原因是它定義一組具體的操作。 //每個 XML Web services 方法都是特定綁定中的一項操作。XML Web services 方法是 XML Web services 的默認綁定的成員, //或者是在應用於實現 XML Web services 的類的 WebServiceBindingAttribute 中指定的綁定的成員。 //XML Web services 可以通過將多個 WebServiceBindingAttribute 屬性應用於 XML Web services 來實現多個綁定。 //將一個或多個 WebServiceAttribute 屬性應用到 XML Web services 之后,可以將 SoapDocumentMethodAttribute 或 SoapRpcMethodAttribute 應用到各個 XML Web services 方法 //以指示由特定的 XML Web services 方法實現的綁定操作。 //設置 SoapDocumentMethodAttribute 或 SoapRpcMethodAttribute 的 Binding 屬性以指定 XML Web services 方法正在為其實現操作的綁定。
[System.ComponentModel.ToolboxItem(false)]//提供工具箱項的基實現。 // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。 // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService// //表示此網站項目實現的一個 Web 服務,如同將此網站引用添加到項目時以 Visual Studio 生成的 .asmx 文件表示一樣。 {
[WebMethod]//向使用 ASP.NET 創建的 XML Web services 中的某個方法添加此屬性 (Attribute) 后,就可以從遠程 Web 客戶端調用該方法。無法繼承此類。 //初始化 WebMethodAttribute 類的新實例。 public string HelloWorld() { return "Hello World"; } } } |
直接運行看看效果,
點擊顯示頁面上圖中的"HelloWorld"超鏈接,跳轉到下一頁面:
點擊"調用"按鈕,就可以看到用XML格式返回的Web Service結果下圖。說明我們的Web Service環境沒有問題,而且還初步接觸了一下最簡單的Web Service。
2.2、創建一個簡單帶有功能的Web Service
上面我們宏觀的了解了webservice,其實它就是個對外的接口,里面有函數可供外部客戶調用(注意:里面同樣有客戶不可調用的函數).假若我們是服務端,我們寫好了個webservice,然后把它給了客戶(同時我們給了他們調用規則),客戶就可以在從服務端獲取信息時處於一個相對透明的狀態.即是客戶不了解(也不需要)其過程,他們只獲取數據.在代碼文件里,如果我們寫了一個函數后,希望此函數成為外部可調用的接口函數,我們必須在函數上面添上一行代碼[WebMethod(Description="函數的描述信息")],如果你的函數沒有這個申明,它將不能被用戶引用.下來我們開始編寫一個簡單的Web Service 的例子。
先把默認的HelloWorld方法注釋掉,簡單的寫了求加減乘除運算的四個方法;
view plaincopy to clipboardprint?
using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
public Service () {
//如果使用設計的組件,請取消注釋以下行
//InitializeComponent();
}
//[WebMethod]
//public string HelloWorld()
//{
// return "Hello World";
//}
[WebMethod(Description = "求和的方法")]
public double addition(double i, double j)
{
return i + j;
}
[WebMethod(Description = "求差的方法")]
public double subtract(double i, double j)
{
return i - j;
}
[WebMethod(Description = "求積的方法")]
public double multiplication(double i, double j)
{
return i * j;
}
[WebMethod(Description = "求商的方法")]
public double division(double i, double j)
{
if (j != 0)
return i / j;
else
return 0;
}
}
using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
public Service () {
//如果使用設計的組件,請取消注釋以下行
//InitializeComponent();
}
//[WebMethod]
//public string HelloWorld()
//{
// return "Hello World";
//}
[WebMethod(Description = "求和的方法")]
public double addition(double i, double j)
{
return i + j;
}
[WebMethod(Description = "求差的方法")]
public double subtract(double i, double j)
{
return i - j;
}
[WebMethod(Description = "求積的方法")]
public double multiplication(double i, double j)
{
return i * j;
}
[WebMethod(Description = "求商的方法")]
public double division(double i, double j)
{
if (j != 0)
return i / j;
else
return 0;
}
}
運行可以看到我們自己寫的可以被調用的方法,如下圖:
同樣點擊addition方法,進入addition方法的調用頁。
在參數上面輸入參數i=3,j=3,如上圖,點擊調用,就可以看到用XML格式返回的Web Service結果(i與j相加的結果)下圖
到這里,我們會發現,其實webservice並不是那么的神秘,它也不過只是個接口,對我們而言,側重點就是是接口函數的編寫.
2.3、用ASP.NET調用Web Service
首先,打開VS2005,打開"文件-新建-網站",選擇"ASP.NET網站"。
選好存儲位置,語言后點擊確定,進入默認頁面。然后先添加Web引用,把WebService引到當前的工程里面。方法是:在資源管理器中點擊右鍵,選擇添加Web 引用,調出對話框:
在URL中填入,前面寫好的WebService運行后瀏覽器上面顯示的地址(即:WebService發布后的訪問地址 ),點擊"前往"按鈕,如上圖,就會顯示出所引用的WebService中可以調用的方法,然后點擊"添加引用",就將webservice引用到了當前的工程里面 ,如下圖,解決方案中會出現引進來的WebService文件
我們在這就練習調用webservice的四個方法,做一個簡單的調用的例子,先在網站的前台添加幾個控件,代碼如下:
view plaincopy to clipboardprint?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無標題頁</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="Num1" runat="server"></asp:TextBox>
<select id="selectOper" runat = "server">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select>
<asp:TextBox ID="Num2" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="=" onclick="Button1_Click" />
<asp:TextBox ID="Result" runat="server"></asp:TextBox>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無標題頁</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="Num1" runat="server"></asp:TextBox>
<select id="selectOper" runat = "server">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select>
<asp:TextBox ID="Num2" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="=" onclick="Button1_Click" />
<asp:TextBox ID="Result" runat="server"></asp:TextBox>
</div>
</form>
</body>
</html>
然后在后台寫調用的代碼,調用之前和使用其它的對象一樣,要先實例化,實例化的方法是localhost.Service a = new localhost.Service();然后就可以通過a來訪問WebService里面提供的方法了。在這個例子里面,動態的創建了一個button控件來觸發WebService的調用,后台代碼如下:
運行后可以看到效果,如下圖所示,在前面兩個Textbox里面輸入兩個操作數,在中間的下拉列表中選擇操作符,然后點擊"="號,將計算的結果輸出到第三個Textbox里面。
而整個計算並不是在本地進行的,是在Web服務端進行計算的然后將結果通過XML返還給了調用方的,所以,在運行該程序的時候,WebService程序還必須啟動,否則會報無法連接遠程服務器的異常,如下圖:
后台代碼如下:
view plaincopy to clipboardprint?
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string selectFlag = selectOper.Value;
localhost.Service web = new localhost.Service();
if (selectFlag.Equals("+"))
{
Result.Text =(web.addition(double.Parse(Num1.Text),double.Parse(Num2.Text))).ToString();
}
else if (selectFlag.Equals("-"))
{
Result.Text = (web.subtract(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
}
else if (selectFlag.Equals("*"))
{
Result.Text = (web.multiplication(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
}
else if (selectFlag.Equals("/"))
{
Result.Text = (web.division(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
}
}
}
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string selectFlag = selectOper.Value;
localhost.Service web = new localhost.Service();
if (selectFlag.Equals("+"))
{
Result.Text =(web.addition(double.Parse(Num1.Text),double.Parse(Num2.Text))).ToString();
}
else if (selectFlag.Equals("-"))
{
Result.Text = (web.subtract(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
}
else if (selectFlag.Equals("*"))
{
Result.Text = (web.multiplication(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
}
else if (selectFlag.Equals("/"))
{
Result.Text = (web.division(double.Parse(Num1.Text), double.Parse(Num2.Text))).ToString();
}
}
}
到此一個一個簡單的WebService的開發和調用就已經完成了,在實際應用中可以根據自己的需要,寫一些功能強大的,復雜的WebService,不管多么復雜,整個流程都是這樣的