程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Web Service(二)+ Web三層架構 (One Demo,More Questions)

Web Service(二)+ Web三層架構 (One Demo,More Questions)

編輯:C++入門知識

  上篇博客介紹了webservice的基礎認識和一個簡單的Hello World例子,實現過程幾乎沒有遇到什麼問題,但是不運用到實際應用中就真不知道能有這麼多問題,下面通過web service來改造三層結構。


一. One Demo

  實現功能:

  實現查詢Northwind數據庫Employees表數據。(Northwind,SQLServer自帶的數據庫,msdn上基本用的都是這個數據庫,我們做Demo用這個就能讓代碼不做修改的在本地運行)

  效果如下:

\

1.首先還是先寫web service

只貼主要代碼了,具體的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!"; } ///

/// 獲取Employees表數據(無參數) /// /// SQL查詢語句 /// DataSet [WebMethod(Description = "Returns Northwind Employees", EnableSession = false)] public DataSet GetEmployees(string sqlText) { SqlDataAdapter adapter = new SqlDataAdapter(sqlText, connection); DataSet ds = new DataSet(); adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; adapter.Fill(ds, "Employees"); //填充數據ds return ds; } }

2. 三層結構(主要是DAL層的變化)

(1)Web後台綁定

	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();
	        }
	
	          }
	}


(2)BLL:

	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();
	        }
	    }
	}

(3)DAL:


	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];
	            
	        }
	}

二. More Questions

代碼寫完啦,滿心歡喜的去F5,結果意料之中很多錯,有錯了才好!


1.配置文件


在 ServiceModel客戶端配置部分中,找不到引用協定“ServiceReference1.WebService1Soap”的默認終結點元素。這可能是因為未找到應用程序的配置文件,或者是因為客戶端元素中找不到與此協定匹配的終結點元素。

   \


錯誤提示很明顯,是客戶端配置文件的問題,一番查詢,看解決辦法:

需要把DAL層引用web service後生成的app.config(包含了引用的web service地址和配置等信息),復制到Web下的Web.config中

將app.config(如下)復制到Web.config的標記下

	
	        
	            
	                
	            
	        
	        
	            
	        
	    


滿心歡喜再去F5,這回可以了吧!

OMG!


2.MaxReceivedMessageSize


已超過傳入消息(65536)的最大消息大小配額。若要增加配額,請使用相應綁定元素上的MaxReceivedMessageSize 屬性。

  \


  MaxReceivedMessageSize是什麼,msdn一下,MaxReceivedMessageSize

  獲取或設置配置了此綁定的通道上可以接收的消息的最大大小。MaxReceivedMessageSize 限制整個消息(標頭和正文)的大小

  類型:System.Int64,綁定可處理的最大消息大小(以字節為單位)。默認值為 65,536 字節。所以我們需要手動配置MaxReceivedMessageSize的大小。

  回到Web.config,添加MaxReceivedMessageSize設置,完整代碼如下:


  
    
      
        
        
        
      
    
    
      
    
  
  
    
  
    
      
      
    
    


  Web.config設置完成,滿心歡喜再去F5!


  3. 服務器請求


  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類,去實現程序間的訪問。


三. 總結

  遇到問題,解決問題,這個過程是一個很享受的過程,曾幾何時,總是提心吊膽的怕遇到問題,躲著問題走,又從何時起,提高班三年的學習,知道問題都不是問題,問題越多,說明需要學習的越多,需要自己改變的也越多,敢於面對問題,解決問題,是你成長的機會。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved