天天看點

基于.NET Remoting的三層分布式應用程式實作 1引言 2分布式應用程式的概念和結構 3.NET Remoting體系結構和基本工作原理 4基于Remoting的分布式應用應用程式實作 5結束語 參考文獻:

摘要:文中主要探讨基于三層分布式結構來開發資料庫應用程式的具體過程和方法。首先,介紹三層分布式結構的體系結構和工作原理;然後介紹.NET Remoting遠端處理架構和ADO.NET資料通路技術。最後通過一個簡單分布式應用程式執行個體進一步闡述,說明三層分布式結構可以大大提高分布式應用程式的運作效率和安全性。

關鍵詞:.NET Remoting;分布式應用程式;VB.NET

Realization of Three-tier Distributed Application Based on.NET Remoting

WU Li

(Jiangsu College of Information Technology,Wuxi 214100,China)

Abstract:Mainly discusses the process and method of exploder database application base on three-tier distributed architecture.First,introduces the architecture and principle of three-tier distributed architecture,Second,introduces.NET Remoting Framework and the technology of data accessing:ADO.NET.Finally,explain that it can advance the efficiency and security of distributed application by giving an example of distributed application processing.

Keys words:.NET Remoting;distributed application;VB.NET

1引言

傳統的用戶端/伺服器端(C/S)結構的資料庫軟體開發模式曾經得到非常普及,但随着計算機往來的不斷發展以及業務對象技術的出現,兩層C/S結構也暴露出其構架上的諸多缺陷。發展成将兩層客戶機/伺服器的體系結構的應用邏輯從使用者端分離出來,形成多層客戶機/伺服器體系結構。本文以三層分布式結構為架構,舉例說明在.NET環境下基于.NET Remoting和ADO.NET資料通路技術,配合VB.NET程式設計語言,實作對分布式資料庫應用程式的具體過程。

2分布式應用程式的概念和結構

分布式應用程式将整個應用程式的處理分成幾個部分,分别在不同的機器上運作的程式。

“分布”一詞包含兩層含義:地理上的分布和資料處理的分布。而在網絡上,分布式應用對使用者來說應該是透明的,即使是在不同的位置,企業不同的業務部門也應該協調分工合作。

傳統的C/S結構一般分為兩層:用戶端和伺服器端。其基本工作原理是:客戶程式向資料伺服器發送SQL請求,伺服器傳回資料和結果。這種結構在近十年内不但得到廣泛運用,而且相當成功。然而随着資訊系統結構的複雜和規模的日益擴大,兩層C/S結構也暴露出其構架上的缺陷:由于用戶端和伺服器端直接連接配接,伺服器将消耗部分系統資源用于處理與用戶端的連接配接工作,進而導緻系統整體運作效率的大幅降低。以及程式移植性差和系統可靠性的極大隐患等。為此将兩層客戶機/伺服器的體系結構的應用邏輯從使用者端分離出來,形成多層客戶機/伺服器體系結構,本文以三層分布式結構為例說明。

三層分布式結構分為表示層、邏輯層和資料層,如圖1所示。表示層提供給使用者一個可視化界面,通過界面層,使用者可以輸入資料或擷取資料,界面層同時也提供一定的安全性,確定使用者不會看到機密的資訊。邏輯層是界面層和資料層的橋梁,它響應界面層的使用者請求執行任務并從資料層擷取資料,并将必要的資料傳送給界面層。邏輯層包含封裝了系統應用邏輯的業務對象,應用系統的大部分計算工作在此完成。邏輯層維護同資料庫的連接配接,采用“資料緩沖”和“代理連接配接”,保證隻有較少兩的擁護資料連接配接,邏輯層擁有自己的記憶體和CPU,并且可根據不同應用需要進行分布式計算,是以能夠提供較高性能的資料庫應用。資料層定義、維護資料的完整性、安全性,它響應邏輯層的請求,通路資料,這一層通常有大型的資料庫伺服器實作。

基于.NET Remoting的三層分布式應用程式實作 1引言 2分布式應用程式的概念和結構 3.NET Remoting體系結構和基本工作原理 4基于Remoting的分布式應用應用程式實作 5結束語 參考文獻:

3.NET Remoting體系結構和基本工作原理

3.1.NET Remoting體系結構

.NET Remoting是内置到Visual Studio.NET公共語言運作庫中的架構。Remoting基礎結構由代理、通道和消息組成。代理是指模仿遠端對象的本地對象,它提供了與遠端對象完全一緻的方法和屬性。要實作指定方法的代理,通常需要将調用傳給通道對象。

通道對象代表了與遠端應用程式的連接配接。每個通道對象都包含一個将方法調用轉換為已知格式消息的格式化程式對象,并将消息發送到伺服器上,用戶端通道對象的鏡像在伺服器上偵聽請求。消息是用于伺服器和用戶端進行通信所建立的資訊包。其體系結構如圖2所示。

基于.NET Remoting的三層分布式應用程式實作 1引言 2分布式應用程式的概念和結構 3.NET Remoting體系結構和基本工作原理 4基于Remoting的分布式應用應用程式實作 5結束語 參考文獻:

3.2基本工作原理

其基本原理如圖1所示,首先,用戶端通過通道通路伺服器端對象,以獲得伺服器端對象的代理。伺服器端對象也即通常所說的遠端對象,使用時是通過跨應用程式邊界傳遞對象引用獲得該遠端對象的代理。對于客戶程式來說,代理提供了與遠端對象完全一樣的方法和屬性。當代理的方法别調用時,就會建立消息,通過使用格式化程式類,将這些消息串行化并發送到客戶通道中。客戶通道和伺服器通道進行通信,以通過網絡傳輸消息。伺服器通道則使用格式化程式并行化消息,進而将方法發送給遠端對象。通過代理,用戶端應用程式就可以像使用本地對象一樣來操作遠端對象。

3.3幾個核心對象

3.3.1通道對象

通道是一種遠端架構,它隐藏了在客戶和伺服器應用程式間通信時所使用的底層協定。通道對象最終用來将每個方法調用從用戶端傳送到伺服器端,并将其傳回值回傳給用戶端。每個通道對象都包含了一個格式化程式對象,該對象将方法調用串行化為适用于底層網絡協定的有效負載。.NET Remoting提供了HTTP和TCP兩種通道實作方式。HTTP通道利用HTTP協定提供連接配接性,在Web伺服器和Web浏覽器間也使用HTTP協定。在每個應用程式域中,對于指定類型的通道,運作庫隻允許注冊一個通道。是以,在一個應用程式域中,不能注冊兩個HTTP通道或TCP通道。

.NET Remoting中通過通道(channel)來實作兩個應用程式域之間的對象通信。Remoting的通道主要有兩種:Tcp和Http。在.NET中,System.Runtime.Remoting.Channel中定義了IChannel接口。IChannel接口包括了TcpChannel通道類型和Http通道類型。它們分别對應Remoting通道的這兩種類型。通道對象代表了到遠端應用程式的連接配接。每個通道對象還包含格式化程式對象,将方法調用轉換為已知格式的消息。

3.3.2遠端對象

遠端對象通常包含了業務邏輯的具體實作,它被建立并存儲在伺服器端,被遠端用戶端代理。遠端對象和其它對象的差別是遠端對象支援引用排程,是以必須從System.MarshalByRefObject繼承。Remoting有以下兩種對象激活模式:

(1)伺服器端激活模式(Server Activated Object):它是由伺服器負責遠端對象的生命周期,包括單件模式(Singleton)和單一調用模式(SingleCall)。

Singleton模式是一種共享模式,任何時候都隻有一個Singleton模式配置的類型執行個體處于活動狀态。如果沒有其它執行個體,用戶端首次通路某執行個體時激活該執行個體。Singleton執行個體會處理所有後來的用戶端通路請求,不管是同一用戶端還是其他用戶端。Singleton執行個體可以在方法調用中維持狀态。它适用于此種情形:如果一個對象的執行個體構造很費時,而具體的業務處理卻不必耗費多少時間;SingleCall是一種無狀态程式設計模型,Remoting基礎結構會為用戶端的每個方法調用激活一個該類型的新執行個體。方法調用傳回之後,基礎結構會讓那個遠端對象執行個體在下次垃圾回收的時候可再循環使用。對于伺服器激活對象,遠端對象的透明代理将在用戶端應用程式域中生成并傳回到用戶端,這時不執行任何遠端調用。隻有在用戶端調用遠端對象的某個方法時,該遠端對象才會被激活。

(2)用戶端激活模式(Client Activated Object):它是由用戶端負責管理遠端對象的生命周期。用戶端激活對象受基于租用的生存期管理器的控制,這種管理器確定了租用期滿時對象可被回收。與如何處理伺服器端激活類型相比,Remoting基礎結構激活每個對象執行個體的時候會給每個用戶端激活的類型指派一個URI。用戶端激活類型的執行個體可以在方法調用中保持活動狀态。

3.4配置檔案和遠端對象的部署

3.4.1配置檔案

在開發遠端對象元件時,可以通過使用配置檔案來簡化代碼并提高配置的靈活性。例如,如果一個遠端對象其激活模式可能為Singleton或SingleCall模式,其通道實作方式可能為HTTP或TCP。要滿足這樣的需求,隻需要在配置檔案中動态指定,而無需修改源程式再重新編譯(具體可參見後面的執行個體)。

3.4.2遠端對象部署

遠端對象中繼資料的部署,通常将遠端類型分成接口和實作,并将每個接口和實作編譯成單獨的程式集,然後将接口程式集部署到用戶端,在伺服器端保留完整實作的程式集。由于遠端對象通常包含了業務邏輯的具體實作,通過部署接口可以防止一些敏感資訊或私有代碼被竊取。

4基于Remoting的分布式應用應用程式實作

設計目标:實作電子圖書館遠端資料查詢功能的分布式應用程式,由包含業務邏輯的遠端對象以及伺服器端和用戶端應用3部分組成;遠端對象:處理具體的書籍查詢業務,建立資料庫連接配接并組裝資料集,是一個可被客戶代理的Windows類庫;伺服器應用:建立通信管道,注冊業務對象,提供遠端對象服務;用戶端應用:調用遠端對象,實作遠端查詢等操作;示例程式使用VB.NET語言設計,并經測試正确。

操作環境:Windows 2000+IIS 6.0+SqlServer 2000+Microsoft Studio.NET 2003。

(1)建立業務邏輯的遠端對象、伺服器端及用戶端應用。啟動Visual Studio.NET并建立名為LibraryMng解決方案;添加名為ServerClassLibrary(遠端對象)的類庫項目;添加名為ServerApp(伺服器端)和ClientApp(用戶端)的Windows Application項目;右擊解決方案并選擇Properties,選擇多個活動項目。

(2)向ServerClassLibrary項目中ManagerBaseClass.vb檔案中添加如下代碼:

Public Class ManagerBaseClass

Inherits System.MarshalByRefObject

End Class

向DataManagerClass.vb檔案添加如下代碼:

Public Class DataManagerClass

Private m_ConnObj As Data.OleDb.OleDbConnection

Private m_LastError As String

Public ReadOnly Property ConnObj()As Data.OleDb.OleDb-

Connection

Get

If m_ConnObj Is Nothing Then

m_ConnObj=New System.Data.SqlClient.SqlConnection("Serv-

er=Localhost;

Database=Librarydatabase;Integrated security=true)

End If

Return m_ConnObj

End Get

End Property

Public Function Connect()As Boolean

Try

If ConnObj.State<>ConnectionState.Open Then

ConnObj.Open()

End If

Return True

Catch ex As Exception

m_LastError="連接配接資料庫失敗:"+ex.Message

Return False

End Try

End Function

Public Shared DatabaseName As String

End Class

向BookMngClass.vb檔案中填加代碼:

<Serializable()>Public Class BookInfo

Public BookID As String

Public BookName As String

End Class

Public Class BookManager

Inherits ManagerBaseClass

Private m_DataManager As DataManagerClass

Public Sub New()

MyBase.New()

m_DataManager=New DataManagerClass

End Sub

Public Shared Sub RegisterSelf()System.Runtime.Re-

moting.RemotingConfiguration.RegisterWellKnownServiceType

(GetType(ServerClassLibrary.LibraryMng.BookManager),"Book-

Manager",

Runtime.Remoting.WellKnownObjectMode.Singleton)

End Sub

Public Function GetAllBookInfo(ByRef ErrStr As String)As

System.Collections.ArrayList

Dim ResultList As New System.Collections.ArrayList

Dim CmdObj As New System.Data.OleDb.OleDbCommand("Se-

lect*from BookTable")

CmdObj.Connection=m_DataManager.ConnObj

Dim Reader As System.Data.OleDb.OleDbDataReader

Dim BInfo As New BookInfo

Dim FieldInde xs(11)As Integer

Dim IndexInited As Boolean=False

Reader=CmdObj.ExecuteReader

While Reader.Read

If Not IndexInited Then

FieldIndexs(0)=Reader.GetOrdinal("FBookID")

FieldIndexs(1)=Reader.GetOrdinal("FBookName")

IndexInited=True

End If

BInfo.BookID=Reader.GetString(FieldIndexs(0))

BInfo.BookName=Reader.GetString(FieldIndexs(1))

Reader.Close()

Reader=Nothing

Return ResultList

End Function

End Class

編譯該項目生成ServerClassLibrary.dll,用于在服務端提供遠

程對象服務。

(3)為ServerClass項目引用System.Runtime.Remoting和

ServerClassLibrary,同時向其各自窗體New()檔案中添加以下代碼:

ServerClassLibrary.LibraryMng.DataManagerClass.Database-

Name="Database.mdb"

m_ServerObjectMng=New ServerClassLibrary.LibraryMng.

ServerObjectMngClass

m_ServerObjectMng.RegistServerObjects()

Dim chl As System.Runtime.Remoting.Channels.Tcp.TcpChan-

nel

chl=New System.Runtime.Remoting.Channels.Tcp.TcpChannel

(9494)

System.Runtime.Remoting.Channels.ChannelServices.Register-

Channel(chl)

并在ServerClass項目中建立服務端界面MainForm.vb檔案

Public Class MainForm

Inherits System.Windows.Forms.Form

Private m_ServerObjectMng As ServerClassLibrary.LibraryMng.

ServerObjectMngClass

Private Sub MinToTrayButton_Click(ByVal sender As System.

Object,ByVal e As

System.EventArgs)Handles MinToTrayButton.Click

MainNotifyIcon.Visible=True

Visible=False

End Sub

End Class

(4)為ClientClass項目引用System.Runtime.Remoting和

ServerClassLibrary,同時向其各自窗體New()檔案中添加以下代碼:

Dim chl As System.Runtime.Remoting.Channels.Tcp.TcpChannel

chl=New System.Runtime.Remoting.Channels.Tcp.TcpChannel

System.Runtime.Remoting.Channels.ChannelServices.Register-

Channel(chl)

并在ServerClass項目中建立用戶端界面BookMngForm.vb檔案,填加一個文本框,一個查詢按鈕,一個ListView控件。

Public Class BookMngForm

Inherits System.Windows.Forms.Form

Private BookMgr As ServerClassLibrary.LibraryMng.BookManag-

er

Private BookList As System.Collections.ArrayList

Private m_LastError As String

Private Sub BookMngForm_Load(ByVal sender As Object,By-

Val e As System.EventArgs)

Handles MyBase.Load

BookMgr=ServerClassLibrary.LibraryMng.BookManager.Get-

Manager(m_LastError)

If BookMgr Is Nothing Then

End If

Try

Dim ErrStr As String

BookList=New ArrayList(BookMgr.GetAllBookInfo(ErrStr))

Catch ex As Exception

m_LastError="擷取圖書清單失敗:"+ex.Message

End Try

End Sub

Private Sub Button1_Click(ByVal sender As System.Object,By-

Val e As System.EventArgs)Handles Button1.Click

Dim BName As String

Dim i As Integer

BName=TextBox1.Text

Dim Books As New System.Collections.ArrayList

For i=0 To BookList.Count-1

If String.Compare(CType(BookList(i),ServerClassLibrary.Li-

braryMng.BookInfo).BookName,BName)=0 Then

Books.Add(BookList(i))

End If

Next

If Books.Count=0 Then

DialogUtilsClass.ErrorDlg("指定圖書沒有找到")

Else

Dim Item As System.Windows.Forms.ListViewItem

Dim BInfo As ServerClassLibrary.LibraryMng.BookInfo

For i=0 To Books.Count-1

BInfo=CType(Books(i),ServerClassLibrary.LibraryMng.BookInfo)

Item=BookListView.Items.Add(BInfo.BookID)

Item.SubItems.Add(BInfo.BookName)

Next

End If

End Sub

End Class

5結束語

使用.NET Remoting技術結合ADO.NET能夠高效、可靠地建立分布式資料應用程式的解決方案。其優勢在于:通過使用.NETRemoting架構能夠友善地解決資料、指令遠端傳遞問題;而通過ADO.NET對資料庫可以友善地進行操作,使分布式資料庫系統中對資料庫的各種操作更加高效、可靠,同時易于解決資料的完整性和一緻性問題。

參考文獻:

[1]何麗,方英蘭,張勇.Visual Basic.NET分布式應用程式開發[M].北京:清華大學出版社,2004.

[2]梁普選,張寶華,李國昌..NET遠端處理構架及分布式對象處理[J].河北工業科技,2004,21(6):35-38.

[3]馬保國,王文豐,侯存軍,錢方正.基于.NET Remoting的分布式系統實作[J].計算機技術與發展,2006,16(3):50-52.

[4]McLean S,Naftel J,Williams K.張昆琪,等譯.Microsoft.NETRemoting權威指南[M].北京:機械工業出版社,2003.

              本文章來源于網際網路,主要用于技術交流并服務廣大研究人員并未用于商業用途

繼續閱讀