上篇博客介紹了webservice的基礎認識和一個簡單的Hello World例子,實現過程幾乎沒有遇到什麼問題,但是不運用到實際應用中就真不知道能有這麼多問題,下面通過web service來改造三層結構。
一. One Demo
實現功能:
實現查詢Northwind數據庫Employees表數據。(Northwind,SQLServer自帶的數據庫,msdn上基本用的都是這個數據庫,我們做Demo用這個就能讓代碼不做修改的在本地運行)
效果如下:
只貼主要代碼了,具體的web service創建請看上篇博客:Web Service(一)
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;"> public class WebService1 : System.Web.Services.WebService
{
public const string connection = @"server=192.168.24.44;database=Northwind;uid=sa;pwd=123456;Trusted_Connection=SSPI";
[WebMethod]
public string HelloWorld()
{
return "Hello World!";
}
///
2. 三層結構(主要是DAL層的變化)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; namespace Web { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { BLL.GridBLL gridBLL = new BLL.GridBLL(); DataTable dt = new DataTable(); dt = gridBLL.Grid(); GridView1.DataSource = dt; GridView1.DataBind(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; namespace BLL { public class GridBLL { DAL.GridDAL gridDAL = new DAL.GridDAL(); public DataTable Grid() { return gridDAL.Grid(); } } }
using DAL.ServiceReference1; //添加web service的服務引用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; namespace DAL { public class GridDAL { //實例化添加web service引用後的WebService1SoapClient 類 public static WebService1SoapClient client = new WebService1SoapClient(); ////// 查詢數據 /// ///DataTable public DataTable Grid() { DataSet ds = new DataSet(); StringBuilder strSql = new StringBuilder(); strSql.Append("select * from Employees "); ds = client.GetCustomers(strSql.ToString()); return ds.Tables[0]; } }
代碼寫完啦,滿心歡喜的去F5,結果意料之中很多錯,有錯了才好!
在 ServiceModel客戶端配置部分中,找不到引用協定“ServiceReference1.WebService1Soap”的默認終結點元素。這可能是因為未找到應用程序的配置文件,或者是因為客戶端元素中找不到與此協定匹配的終結點元素。
錯誤提示很明顯,是客戶端配置文件的問題,一番查詢,看解決辦法:
需要把DAL層引用web
service後生成的app.config(包含了引用的web service地址和配置等信息),復制到Web下的Web.config中
將app.config(如下)復制到Web.config的
滿心歡喜再去F5,這回可以了吧!
OMG!
已超過傳入消息(65536)的最大消息大小配額。若要增加配額,請使用相應綁定元素上的MaxReceivedMessageSize 屬性。
MaxReceivedMessageSize是什麼,msdn一下,MaxReceivedMessageSize
獲取或設置配置了此綁定的通道上可以接收的消息的最大大小。MaxReceivedMessageSize 限制整個消息(標頭和正文)的大小
類型:System.Int64,綁定可處理的最大消息大小(以字節為單位)。默認值為
65,536 字節。所以我們需要手動配置MaxReceivedMessageSize的大小。
回到Web.config,添加MaxReceivedMessageSize設置,完整代碼如下:
System.Web.Services.Protocols.SoapException:服務器無法處理請求。 --->System.Data.SqlClient.SqlException: 登錄失敗。該登錄名來自不受信任的域,不能與 Windows身份驗證一起使用。
首先需要說明的是,web service中使用的數據庫連接是服務器的地址,而非本機的。
該登錄名來自不受信任的域,不能與 Windows身份驗證一起使用。問題出在web service上,web service訪問數據庫時,web service所在主機被列為不受信用的域,且不能與Windows身份驗證一起使用,那我們就把訪問設置成非Windows身份驗證。
添加Integrated Security=false;
當 Integrated Security 為 false 時,將在連接中指定用戶 ID 和密碼;當為 true 時,將使用當前的 Windows 帳戶憑據進行身份驗證。
F5繼續,大功告成!
相當簡單的三層結構,只是添加了Web Service實現,從實現中看,Web Service的作用相當於SqlHelper類,去實現程序間的訪問。
遇到問題,解決問題,這個過程是一個很享受的過程,曾幾何時,總是提心吊膽的怕遇到問題,躲著問題走,又從何時起,提高班三年的學習,知道問題都不是問題,問題越多,說明需要學習的越多,需要自己改變的也越多,敢於面對問題,解決問題,是你成長的機會。