萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> .net編程 >> ASP.NET教程:18.2 創建Web服務

ASP.NET教程:18.2 創建Web服務

class="area">

ASP.NET中創建一個Web服務與創建一個網頁相似。但是Web服務沒有用戶界面,也沒有可視化組件,並且Web服務僅包含方法。Web服務可以在一個擴展名為.asmx的文件中編寫代碼,也可以放在代碼隱藏文件中。在Visual Studio 2008中,.asmx文件的隱藏文件創建在App_Code目錄下。

一、Web服務文件的指令

Web服務文件中包括一個WebServices指令,該指令必須應用在所有Web服務中。語法代碼如下:

折疊展開XML/HTML 代碼復制內容到剪貼板
  1. <%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %>

其中,

★ Language屬性:指定在Web services使用的語言。可以為.NET支持的任何語言,包括C#、Visual Basic和JScript。該屬性是可選的,如果未設置該屬性,編譯器將根據類文件使用的擴展名推導出所使用的語言。

★ Class屬性:指定實現Web services的類名,該服務在更改後第一次訪問Web services時被自動編譯。該值可以是任何有效的類名。該屬性指定的類既可以存儲在單獨的代碼隱藏文件中,也可以存儲在與WebService指令相同的文件中。該屬性是Web services必需的。

★ CodeBehind屬性:指定Web services類的源文件的名稱。

★ Debug屬性:指示是否使用調試方式編譯Web services。如果啟用調試方式編譯Web services,Debug屬性則為true,否則為false。默認為false。在Visual Studio 2008中,Debug屬性是由Web config文件中的一個輸入值決定的,所以開發Web services時,該屬性會被忽略。

二、Web服務代碼隱藏文件

在代碼隱藏文件中包含一個類,它是根據Web服務的文件名命名的。這個類有兩個特性標簽,WebService和WebServiceBinding。在該類中還有一個名為HelloWorld的模板方法,它將返回一個字符串。這個方法使用WebMethod特性修飾,該特性表示方法對於Web服務使用程序可用。

1.WebService特性

對於將要發布和執行的Web服務來說,WebService特性是可選的。可以使用WebService特性為Web服務指定不受公共語言運行庫標識符規則限制的名稱。

Web服務在成為公共之前,應該更改其默認的XML命名空間。每個XML Web services都需要唯一的XML命名空間來標識它,以便客戶端應用程序能夠將它與網絡上的其他服務區分開來。http://tempuri.org/可用於正在開發中的Web服務,已發布的web服務應該使用更具永久性的命名空間。例如,可以將公司的Internet域名作為XML命名空間的一部分。雖然很多Web服務的XML命名空間與URL根相似,但是,它們無須指向Web上的某一實際資源(Web服務的XML命名空間是URL)。對於使用ASP.NET創建的Web服務,可以使用Namespace屬性更改默認的XML命名空間。

例1 將WebService特性的XML命名空間設置為http://www.qqb4.com。代碼如下:

折疊展開C# 代碼復制內容到剪貼板
  1. using System;
  2. using System.Web.Services;
  3. [WebService(Namespace="http://www.QQb4.com/")]
  4. public class Service : System.Web.Services.WebService
  5. {
  6. public Service()
  7. {
  8. //如果使用設計的組件,請取消注釋以下行
  9. //InitializeComponent();
  10. }
  11. [WebMethod]
  12. public string HelloWorld()
  13. {
  14. return "Hello World";
  15. }
  16. }

2.WebServiceBinding特性

按Web服務描述語言(WSDL)的定義,綁定類似於一個接口,原因是它定義一組具體的操作。每個Web services方法都是特定綁定中的一項操作。Web services方法是Web services的默認綁定的成員,或者是在應用於實現Web services的類的WebServiceBinding特性中指定綁定的成員。Web服務可以通過將多個WebServiceBinding特性應用於Web services來實現多個綁定。

3.WebMethod特性

Web serwces類包含一個或多個可在Web服務中公開的公共方法。這些Web services方法以WebMethod特性開頭。為使用ASP.NET創建的Web服務中的某個方法添加此WebMethod特性後,就可以從遠程Web客戶端調用該方法。

WebMethod特性包括一些屬性,這些屬性可以用於設置特定Web方法的行為,語法如下:

折疊展開XML/HTML 代碼復制內容到剪貼板
  1. [WebMethod(PropertyName=value)]

WebMethod特性提供以下屬性:

★ BufferResponse屬性

BufferResponse屬性啟用對WebServices方法響應的緩沖。當設置為true時,ASP.NET在將響應從服務器向客戶端發送之前,對整個響應進行緩沖。當設置為false時,ASP.NET以16KB的塊區緩沖響應。默認值為true。

★ CacheDuration屬性

CacheDuration屬性啟用對Web servlces方法結果的緩存。ASP.NET將緩存每個唯一參數集的結果。該屬性的值指定ASP.NET應該對結果進行多少秒的緩存處理。值為0時,則禁用對結果進行緩存。默認值為0。

★ Description屬性

Description屬性提供Web services方法的說明字符串。當在浏覽器上測試Web服務時,該說明將顯示在Web服務幫助頁上。默認值為空字符串。

★ EnableSession屬性

EnableSession屬性設置為true,啟用Web servlces方法的會話狀態。一旦啟用,Web servICes就可以從HttpContextCurrent.Session中直接訪問會話狀態集合,如果它是從WebService基類繼承的,則可以使用WebService.Session屬性來訪問會話狀態集合。默認值為false。

★ MessageName屬性

Web服務中禁止使用方法重載。但是,可以通過使用MessageName屬性消除由多個相同名稱的方法造成的無法識別問題。

MessageName屬性使Web服務能夠唯一確定使用別名的重載方法。默認值是方法名稱。當指定MessageName時,結果SOAP消息將反映該名稱,而不是實際的方法名稱。

三、創建一個簡單的Web服務

下面通過一個實例,具體介紹如何創建Web服務。

例2 創建一個具有查詢功能的Web服務。程序實現的主要步驟:(實例位置:網頁ASP.NET 3.5教程案例資源\18\ch01)

(1)打開Visual Studio 2008開發環境,依次選擇“文件”/“新建網站”命令,彈出“新建網站”對話框,在該對話框中選擇“ASP.NET Web服務”模板,並命名為ch01。

(2)單擊“確定”按鈕,將會創建App_Code/Service.cs頁面。

該頁為Web服務的代碼隱藏文件。它包含了自動生成的一個類,並生成一個名為HelloWorld的模板方法。它將返回一個字符串,代碼如下。

折疊展開C# 代碼復制內容到剪貼板
  1. using System;
  2. using System.Linq;
  3. using System.Web;
  4. using System.Web.Services;
  5. using System.Web.Services.Protocols;
  6. using System.Xml.Linq;
  7. using System.Data.OleDb;
  8. [WebService(Namespace = "http://tempuri.org/")]
  9. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  10. // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。
  11. // [System.Web.Script.Services.ScriptService]
  12. public class Service : System.Web.Services.WebService
  13. {
  14. public Service()
  15. {
  16. //如果使用設計的組件,請取消注釋以下行
  17. //InitializeComponent();
  18. }
  19. [WebMethod]
  20. public string HelloWorld()
  21. {
  22. return "Hello World";
  23. }
  24. }

(3)在代碼中添加自定義的方法Select(),代碼如下。

折疊展開C# 代碼復制內容到剪貼板
  1. [WebMethod(Description = "輸入聯系人姓名,返回詳細信息")]
  2. public string Select(string stuName)
  3. {
  4. //建立Access數據庫連接
  5. OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db18.mdb"));
  6. //打開數據庫連接
  7. conn.Open();
  8. //執行SQL語句
  9. OleDbCommand cmd = new OleDbCommand("select * from 聯系人 where 名字='" + stuName + "'", conn);
  10. OleDbDataReader dr = cmd.ExecuteReader();
  11. string txtMessage = "";
  12. //讀取數據
  13. if (dr.Read())
  14. {
  15. txtMessage = "名字:" + dr["名字"] + " ,";
  16. txtMessage += "地址:" + dr["地址"] + " ,";
  17. txtMessage += "公司名稱:" + dr["公司名稱"] + " ,";
  18. txtMessage += "頭銜:" + dr["頭銜"] + " ,";
  19. }
  20. else
  21. {
  22. if (String.IsNullOrEmpty(stuName))
  23. {
  24. txtMessage = "<Font Color='Blue'>請輸入姓名</Font>";
  25. }
  26. else
  27. {
  28. txtMessage = "<Font Color='Red'>查無此人!</Font>";
  29. }
  30. }
  31. cmd.Dispose();
  32. dr.Dispose();
  33. conn.Dispose();
  34. return txtMessage; //返回查詢信息
copyright © 萬盛學電腦網 all rights reserved