top
Loading...
ASP.NET高級應用

XML及其應用

XML 是標準擴展語言的簡稱,是未來Web編程的標準。在這一章中,我們將講述XML在ASP.NET中的應用

制作廣告條

在這個程序中,我們通過XML語言實現每次訪問網頁時,將顯示不同的廣告條。在本例中,我們只調用了兩條廣告
源文件:advanceappintro.aspx

Intro.aspx的代碼如下:



<html>
<center><title>廣告條演示</title></center>
<head>
<link rel="stylesheet"href="intro.css">
</head>
<body>
<center>
<form action="intro.aspx" method="post" runat="server">
<h2>廣告條演示</h2>
<asp:adrotator AdvertisementFile="intro.xml" BorderColor="black" BorderWidth=1 runat="server"/>
</form>
</center>
</body>
</html>


intro.xml的 代碼如下:
<Advertisements>
<Ad>
<ImageUrl>./hp1.gif</ImageUrl>
<NavigateUrl>http://www.yesky.com</NavigateUrl>
<AlternateText>歡迎訪問!</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>


<Ad>
<ImageUrl>./hp2.gif</ImageUrl>
<NavigateUrl>http://www.yesky.com</NavigateUrl>
<AlternateText>歡迎訪問</AlternateText>
<Keyword>Computers</Keyword>
<Impressions>80</Impressions>
</Ad>
</Advertisements>


在intro.aspx中,我們使用了<asp:adrotator AdvertisementFile="intro.xml" BorderColor="black" BorderWidth=1 runat="server"/>這條語句來嵌入intro.xml文件。

三層結構及其應用

概念及環境

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:..insaidy.dll /t:library /r:system.dll /r:system.data.dll / r:system.data.sql.dll

dblink.vb

這是編譯.vb程序的命令,如果是編譯.cs文件,則命令會是不一樣,我們假定有一個saidy.cs的文件,按照上面的要求,我們編譯如下:

cs /out:..insaidy.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
下面看看我們完整的代碼(advanceappdblink.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",也可以為其他機器的公有隊列,如"Saidy777$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屬性:以千字節為單位設置一個隊列(日志隊列)的消息最大容納量。一旦接收的消息到達這個容量,新的消息將不再被接收。

一般情況下,消息隊列的最大值為消息隊列管理員所設置,如果這個值沒有控制的話,那么缺省的消息隊列最大容量將是無限制的。

UseJournalQueue屬性::設置是否將收到的消息拷貝到日志消息隊列中去。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗