前段時間一直在學習WCF,匆匆忙忙的把《WCF全面解析》和《WCF服務編程》看了一遍,好多東西都不是很懂,又聽了一下WCF分布式開發的網絡教程,算是馬馬虎虎的明白點了。回顧了一下Webservice,將二者進行比較學習。考慮到以后的發展,當時決定學習WCF,希望自己在不久的將來能將WCF學的稍微精通點吧。這幾天又將Webservice看了一遍,回想當時學習Webservice處處碰到坑,由於沒人指點,連最基本地點發布都折騰好長時間,只能一點一點的填坑跳坑。這幾天閑了,想寫一個簡單的Webservice,希望能給當時和我一樣的人有所幫助,也當給自己做個筆記。簡單的demo,大牛可以繞道了,食品追溯。
先寫個WinForm調用的模擬服務的,下篇寫個WebForm下AJAX調用的。
首先,新建一個空的web應用程序。文件—>新建—>項目,選擇Web下的ASP.NET 空 Web 應用程序。取名:MyWeb,如下圖:
確定
再添加Web服務,添加—>新建項—>Web—>Web 服務,取名:MyService.asmx。如下圖:
添加Web服務完成
在這里,模擬一個服務,類似於通過生日查詢上輩子是誰的的測試。數據庫添加點簡單的數據,如下圖:
這里偷懶,我用EF了。添加—>新建項—>數據—>ADO.NET 實體數據模型,取名:DB.edmx。如下圖:
數據表已經建好了,選擇從數據庫生成,如下圖:
下一步,連接屬性
接着下一步
選擇WhoAreYou表,完成
在服務端寫服務,這里只簡單些個獲取名字的方法。服務端代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services; 6 7 namespace MyWeb 8 { 9 /// <summary> 10 /// MyService 的摘要說明 11 /// </summary> 12 [WebService(Namespace = "http://tempuri.org/")] 13 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 14 [System.ComponentModel.ToolboxItem(false)] 15 // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消注釋以下行。 16 // [System.Web.Script.Services.ScriptService] 17 public class MyService : System.Web.Services.WebService 18 { 19 muyiEntities db = new muyiEntities(); 20 // 問:請用一句話概況你的職業 21 // 答:Hello World 22 [WebMethod] 23 public string HelloWorld() 24 { 25 return "Hello World"; 26 } 27 28 // Description是對服務方法的描述介紹 29 [WebMethod(Description = "模擬根據生日測試你上輩子是誰?")] 30 public string WhoAreYou(string birthday) 31 { 32 // 根據客戶端提供的生日,查詢數據庫,查出對應的人。 33 List<WhoAreYou> who = db.WhoAreYou.Where(u => u.Birthday == birthday).ToList(); 34 // 本例模擬一個生日只對應一個人 35 WhoAreYou you = who[0]; 36 //返回對應人名字 37 return you.Name; 38 } 39 } 40 }
寫好以后,我們要發布到IIS上,先建立一個空網站。打開IIS,網站—>添加網站,輸入IP、端口。這里有兩個坑。首先,網站的名稱要和發布的web服務名稱一致,不然報錯,在發布服務時提示沒有MyService的站點。第二,應用程序池要選擇程序集4.0,如果是2.0,會提示錯誤。這是當時我做的時候遇到的兩個坑。
建立好空站點后,我們將寫好的web服務發布到這里。首先生成一下,發布。將Web服務發布到我們剛在建立的網站。
發布成功后瀏覽網站
報錯,沒有添加默認文檔
添加默認文檔
雙擊打開,右鍵—>添加,或點擊右上角的添加,錄入服務的名字
瀏覽,成功
好了,現在可以調用服務了。為了區別,重新新建一個winform窗體項目
添加服務引用
在地址欄中填入Web服務地址,在這里注意命名空間,這里改為了MWS,是客戶端調用服務的命名空間。
引用成功后,在引用文件夾下多出來了MWS,如下圖:
打開窗體,后台,我們開始寫客戶端的調用代碼。
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using WEBFORM.MWS; 11 12 namespace WEBFORM 13 { 14 public partial class FormHello : Form 15 { 16 public FormHello() 17 { 18 InitializeComponent(); 19 } 20 21 private void btnTest_Click(object sender, EventArgs e) 22 { 23 if (txtBirthday.Text.Trim() == "") 24 { 25 MessageBox.Show("請輸入生日"); 26 return; 27 } 28 string birthday = txtBirthday.Text; 29 MyServiceSoapClient ws = new MyServiceSoapClient(); 30 txtName.Text = ws.WhoAreYou(birthday); 31 } 32 } 33 }
F5運行
點擊測試按鈕
結束語:Stay Hungry. Stay Foolish.