ASP.NET進階應用程式二則

來源:互聯網
上載者:User

二、三層結構及其應用
  
    概念及環境
  
    ASP.NET中的三層結果開發方法,其實其思想跟Java的一樣。Java中的三層架構為前端的html、Jsp、Servlet,中介層為JavaBean、EJB,後面為資料庫伺服器。而在ASP.NET中,前段為html、asp、aspx等,中介層為有.vb、.cs等檔案編譯而成的.dll控制項,後面為資料庫伺服器。
  
    在我們的三層架構中,我們的資料庫層通過中介層來串連以及操作,前端給中介層傳遞參數,並接受中介層的參數。在我們的ASP.NET中,我們主要關注的是我們的中介層與前端的資料互動。
  
    我們一般統稱中介層為組件,組件可以用.vb編譯而成,也可以用.cs檔案編譯而成。中介層一般為.dll檔案。微軟的.NET技術在這個方面比他的以前的任何版本都要來的簡單,這也是它的一打好處之一。以前我們要註冊一個.dll檔案,有是註冊有是重啟動,而在.net上,我們的.dll檔案拿來就用,不用再考慮註冊的問題。
  
    在沒有Visual stutio.net之前,我們用寫成的.bat檔案來把.vb和.cs檔案編譯成.dll檔案,在.bat檔案裡,我們寫入編譯的檔案名稱、相關聯的名字空間、要編譯成的檔案名稱以及對應的命令名稱,然後運行就行了。聽起來很複雜,這也是很多初學者在編譯第一個.dll檔案時所害怕的事情。但是做起來很簡單的。下面我們舉一個例子來說明.bat檔案的寫法,假設我們有一個檔案名稱為:saidy.vb的檔案,我們要把它編譯成saidy.dll的檔案,其中用到System、System.Data、System.Data.SQL名字空間,我們可以建立一個dblink.bat檔案,內容如下:
  
    vbc /out:../bin/saidy.dll /t:library /r:system.dll /r:system.data.dll / r:system.data.sql.dll
  
    dblink.vb
  
    這是編譯.vb程式的命令,如果是編譯.cs檔案,則命令會是不一樣,我們假定有一個saidy.cs的檔案,按照上面的要求,我們編譯如下:
  
    cs /out:../bin/saidy.dll /t:library /r:system.dll /r:system.data.dll / r:system.data.sql.dll
  dblink.cs
  
    我們可以看出來,大部分是一樣的。
  
    當然,如果我們有微軟公司的vs.net編程環境,則我們不用這麼麻煩,我們可以象編譯vb或者vc程式一樣方便的編譯.dll檔案。微軟公司的vs.net是一個集大成者,把各種語言整合起來,在這個環境下都可以寫出不同語言的程式。具體的應用我們會在專門的章節上介紹的。
  
    一個基於三層架構的例子
  
    我們通過具體的例子來說明三層架構的應用,我們建一個小項目來說明這個問題。有時為了安全性,我們通常把與資料庫的串連用一個動態串連庫檔案封裝起來,這樣我們就要把寫資料庫連接的.vb或者.cs檔案編譯成動態串連庫.dll檔案。甚至我們把對資料庫的相關操作頁編譯成.dll檔案。
  
    下面是我們的與資料庫連接以及操作的檔案dblink.vb的主要部分,對資料庫的串連:
  
    Dim dbl As SQLConnection
  
    對資料庫的操作,我們把它寫在一個方法裡面,在返回相應值:
  Function getdata() as DataView
  Dim sComm as SQLDataSetCommand
  Dim sDS as DataSet
  Dim sStr as String
  dbl = New SQLConnection("server=localhost;uid=sa;password=;database=howff")
  sStr = "select * from color"
  sComm = new SQLDataSetCommand(sStr,dbl)
  sDS = new DataSet()
  sComm.FillDataSet(sDS,"color")
  Return sDS.Table["color"].DefaultView
  End Function  
   
    我們第六個語句就用到上面的與資料庫的串連變數,我們這個函數的功能是從表"color"中選出所有的元素,並返回表結構的形式。完整的代碼如下:    
   
  Imports System
  Imports System.Data
  Imports System.Data.SQL
  '建立名字空間
  Namespace db
  '建立一個類
  Public Class dblink
  '建立資料庫的串連
  Dim dbl As SQLConnection
  '方法
  Public Function getdata() As DataView
  Dim sComm As SQLDataSetCommand
  Dim sDS As DataSet
  dbl = New SQLConnection("server=localhost;uid=sa;password=;database=howff")
  Dim sStr As String
  sStr = "select * from color"
  sComm = New SQLDataSetCommand(sStr, dbl)
  '填充資料
  sDS = New DataSet()
  sComm.FillDataSet(sDS, "color")
  '返回
  Return sDS.Tables("color").DefaultView
  End Function
  End Class
  End Namespace
  我們再寫一個前端掉用頁面saidy.aspx,我們首先要引入我們建立的名字空間:
  
  <%@ Import Namespace="db" %>
  
  在頁面裝入的時候,我們用此方法:
  Sub Page_Load(Sender As Object, E As EventArgs)
  '建立一個新的對象
  Dim newdb As dblink
  newdb = new dblink()
  '資料來源
  Products.DataSource = newdb.getdata()
  '資料繫結
  Products.DataBind()
  End Sub
  下面看看我們完整的代碼(advanceapp/dblink.aspx):
  <%@ Import Namespace="db" %>
  <html>
  <script language="VB" runat="server">
  Sub Page_Load(Sender As Object, E As EventArgs)
  '建立一個新的對象
  Dim newdb As dblink
  newdb = new dblink()
  '資料來源
  Products.DataSource = newdb.getdata()
  '資料繫結
  Products.DataBind()
  End Sub
  </script>
  <body style="font: 10pt verdana" bgcolor="CCCCFF">
  <BR><BR><BR>
  <CENTER>
  <h3>.NET->三層架構!</h3>
  </CENTER>
  <BR><BR>
  <CENTER>
  <ASP:DataList id="Products" ShowHeader=false ShowFooter=false RepeatColumns="2" RepeatDirection="horizontal" BorderWidth=0 runat="server">
  <template name="itemtemplate">
  <table>
  <tr>
  <td width="150" style="text-align:center; font-size:8pt; vertical-align:top;
  height:50">
  <p>
  <%# DataBinder.Eval(Container.DataItem, "id") %> <br>
  <%# DataBinder.Eval(Container.DataItem, "name", "{0:C}").ToString() %>
  </td>
  </tr>
  </table>
  </template>
  </ASP:DataList>
  </CENTER>
  </body>
  </html>
  
    我們看到,在這個頁面當中,沒有出現與資料庫互動的語句,這樣我們就很好的把資料操作封裝起來了

三、使用MSMQ
  
    MSMQ(MicroSoft Message Queue,微軟訊息佇列)是在多個不同的應用之間實現相互連信的一種非同步傳輸模式,相互連信的應用可以分佈於同一台機器上,也可以分佈於相連的網路空間中的任一位置。它的實現原理是:訊息的寄件者把自己想要發送的資訊放入一個容器中(我們稱之為Message),然後把它儲存至一個系統公用空間的訊息佇列(Message Queue)中;本地或者是異地的訊息接收程式再從該隊列中取出發給它的訊息進行處理。
  
    在訊息傳遞機制中,有兩個比較重要的概念。一個是訊息,一個是隊列。訊息是由通訊的雙方所需要傳遞的資訊,它可以是各式各樣的媒體,如文本、聲音、圖象等等。訊息最終的理解方式,為訊息傳遞的雙方事先商定,這樣做的好處是,一是相當於對資料進行了簡單的加密,二則採用自己定義的格式可以節省通訊的傳遞量。訊息可以含有發送和接收者的標識,這樣只有指定的使用者才能看到只傳遞給他的資訊和返回是否操作成功的回執。訊息也可以含有時間戳記,以便於接收方對某些與時間相關的應用進行處理。訊息還可以含有到期時間,它表明如果在指定時間內訊息還未到達則作廢,這主要應用與時間性關聯較為緊密的應用。
  
    訊息佇列是發送和接收訊息的公用儲存空間,它可以存在於記憶體中或者是物理檔案中。訊息可以以兩種方式發送,即快遞方式(express)和可復原模式(recoverable),它們的區別在於,快遞方式為了訊息的快速傳遞,把訊息放置於記憶體中,而不放於物理磁碟上,以擷取較高的處理能力;可復原模式在傳送過程的每一步驟中,都把訊息寫入物理磁碟中,以得到較好的故障恢複能力。訊息佇列可以放置在發送方、接收方所在的機器上,也可以單獨放置在另外一台機器上。正是由於訊息佇列在放置方式上的靈活性,形成了訊息傳送機制的可靠性。當儲存訊息佇列的機器發生故障而重新啟動以後,以可復原模式發送的訊息可以恢複到故障發生之前的狀態,而以快遞方式發送的訊息則丟失了。另一方面,採用訊息傳遞機制,發送方必要再擔心接收方是否啟動、是否發生故障等等非必要因素,只要訊息成功發送出去,就可以認為處理完成,而實際上對方可能甚至未曾開機,或者實際完成交易時可能已經是第二天了。
  
    採用MSMQ帶來的好處是:由於是非同步通訊,無論是發送方還是接收方都不用等待對方返回成功訊息,就可以執行餘下的代碼,因而大大地提高了事物處理的能力;當資訊傳送過程中,資訊發送機制具有一定功能的故障恢複能力;MSMQ的訊息傳遞機制使得訊息通訊的雙方具有不同的物理平台成為可能。
  
    在微軟的.net平台上利用其提供的MSMQ功能,可以輕鬆建立或者刪除訊息佇列、發送或者接收訊息、甚至於對訊息佇列進行管理。
  
    在.NET產品中,提供了一個MSMQ類庫"System.Messaging.dll"。它提供了兩個類分別對訊息對象和訊息佇列對象進行操作。在能夠使用MSMQ功能之前,你必須確定你的機器上安裝了MSMQ訊息佇列組件,並確保服務正在運行中。在使用ASP.NET編程時,應在頭部使用:
  
     <%@ Assembly Name="System.Messaging"%>
  
     <%@ Import NameSpace="System.Messsaging"%>
  
    將MSMQ類庫引入ASP.NET檔案
  
    1. 對訊息佇列的建立
  
     dim MsgQue as MessageQueue
  
     MsgQue=New MessageQueue(MsgPath)
  
  其中:MsgPath可以為本地私人隊列,如"./MyQueue",也可以為其他機器的公有隊列,如"Saidy/777$/MyQueue",Saidy為另一機器名。
  
  
    2. 訊息的發送
  
     dim MsgQue as MessageQueue
  
     MsgQue.Send(Msg)
  
     其中:Msg為任一對象。
  
    3. 訊息的接收
  
    訊息的接收又分成同步和非同步方式兩種,同步接收在規定時間內從訊息佇列中取出收到的第一條訊息,當訊息佇列中沒有訊息時,程式處於等待狀態;非同步接收方式則是定義了一個事件處理函數,當訊息佇列中第一個訊息到達時立即觸發該函數。
  
    1) 同步方式
  
     dim Msg as Message
  
    dim Fmt As XmlMessageFormatter
  
    Fmt= CType(MsgQue.Formatter,XmlMessageFormatter)
  
    Fmt.TargetTypeNames = new String(){"System.String"}
  
    Msg=MsgQue.receive(New TimeSpan(0,0,3))
  
    首先定義收到訊息應轉換成的格式,然後在指定時間內去接收訊息
  
    2) 非同步方式 
   
  dim Fmt As XmlMessageFormatter
  '定義接收訊息類型
  Fmt = CType(MsgQue.Formatter,XmlMessageFormatter)
  Fmt.TargetTypeNames = new String(){"System.String"}
  
  '定義訊息處理函數入口
  AddHandler MsgQue.ReceiveCompleted, New ReceiveCompletedEventHandler
  (AddressOf OnReceiveCompleted)
  
  '定義訊息處理函數
  Public Shared Sub OnReceiveCompleted(s As Object, asyncResult As ReceiveAsyncEventArgs)
  Dim MsgQue As MessageQueue = CType(s,MessageQueue)
  Dim Msg As Message = MsgQue.EndReceive(asyncResult.AsyncResult)
  '此時Msg.Body即為所取訊息對象
  MsgQue.BeginReceive()
  '重新定義非同步接收方式
  End sub
  
  '啟動非同步接收方式
  MsgQue.BeginReceive
  
  
    訊息佇列配置屬性
  
    關於隊列的屬性
  
     path屬性:它可以決定引用隊列的三種方式,路徑引用、格式名引用、標識引用
  
     category屬性:標識當前使用的隊列的類型。Category是隊列所有者定義的GUID值。該GUID值可以有GUID產生工具產生或者是使用者自訂的數字值。GUID值不會唯一,這樣才可以根據相同的GUID值,把多個訊息佇列劃分為不同的類別(category)。
  
    跟發送資料類型相關的屬性
  
     Formatter屬性:決定在一個隊列中如何發送和接收訊息的順序,以及可以在一個訊息中發送什麼樣的內容。
  
    和隊列互動相關的屬性
  
     DenyShareReceive屬性:決定同一時間內只有一個組件能夠訪問訊息佇列中的訊息。
  
     CanRead和CanWrite屬性:決定隊列是否可以被讀取或者是寫入。
  
     MaximumQueueSize和MaximumJournalSize屬性:以KB為單位設定一個隊列(日誌隊列)的訊息最大容納量。一旦接收的訊息到達這個容量,新的訊息將不再被接收。
  
    一般情況下,訊息佇列的最大值為訊息佇列管理員所設定,如果這個值沒有控制的話,那麼預設的訊息佇列最大容量將是無限制的。
  
     UseJournalQueue屬性::設定是否將收到的訊息拷貝到日誌訊息佇列中去。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.