c#_操作webservice(經典入門教程)


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 soap關系

http:是一個客戶端和服務器端請求和應答的標准(TCP)。http協議其目的是為了提供一種發布和接收htttp頁面的方法

一http協議的客戶端與服務器的交互:HTTP客戶端發起一個請求,建立一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監聽客戶端發送過來的請求。一旦收到請求,服務器(向客戶端)發回一個狀態行,比如"HTTP/1.1 200 OK",和(響應的)消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。

 

soap 協議:它描述了一種在分散或分布式的環境中如何交換信息的輕量級協議。soaphttp協議的基礎上,一個基於XML的協議。

不同:都是底層的通信協議,請求包的格式不同而已,soap包是XML格式,http純文本格式。

關系:SOAP是個通信協議, SOAPHTTP協議的基礎上,把編寫成XMLREQUEST參數, 放在HTTP BODY上提交個WEB SERVICE服務器(SERVLETASP什么的) 處理完成后,結果也寫成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消息

概念補充:

View Code

XML Web Service的特點

View Code

二、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,不管多么復雜,整個流程都是這樣的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM