




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
DXperienceUniversal
C#學(xué)習(xí)之接口
什么是接口?其實(shí),接口簡單理解就是一種約定,使得實(shí)現(xiàn)接口的類或結(jié)構(gòu)在形式上保持一致。個(gè)人
覺得,使用接口可以使程序更加清晰和條理化,這就是接口的好處,但并不是所有的編程語言都支持接口,
C#是支持接口的。注意,雖然在概念上,C#接口類似于COM接口,但他們的底層結(jié)構(gòu)是不同的。那么,
我們來看下如何聲明和使用接口。
聲明接口
聲明接口在語法上和聲明抽象類完全相同,例如這里有個(gè)銀行賬戶的接口:
publicinterfaceIBankAccount
(
voidPayIn(decimalamount);
boolWithdraw(decimalamount);
decimalBalance
{
get;
)
注意:接口中只能包含方法、屬性、索引器和事件的聲明。不允許聲明成員上的修飾符,即使是pubilc
都不行,因?yàn)榻涌诔蓡T總是公有的,也不能聲明為虛擬和靜態(tài)的。如果需要修飾符,最好讓實(shí)現(xiàn)類來聲明。
使用接口的例子
這是書上的一個(gè)簡單的例子,但足以說明接口的使用方法。
一個(gè)銀行賬戶的接口,兩個(gè)不同銀行賬戶的實(shí)現(xiàn)類,都繼承于這個(gè)接口。接口聲明如上。下面是兩個(gè)
賬戶類:
classSaverAccount:IBankAccount
(
privatedecimalbalance;
publicdecimalBalance
(
get
(
returnbalance;
)
)
publicvoidPayln(decimalamount)
{
balance+=amount;
}
publicboolWithdraw(decimalamount)
{
if(balance>=amount)
{
balance-=amount;
returntrue;
)
Console.WriteLine("Withdrawfailed.**);
returnfalse;
)
publicoverridestringToString()
(
returnString.Format("VenusBankSaver:Balance={0,6:C}”,balance);
)
)
classGoldAccount:IBankAccount
(
privatedecimalbalance;
publicdecimalBalance
(
get
(
returnbalance;
)
)
publicvoidPayln(decimalamount)
(
balance+=amount;
)
publicboolWithdraw(decimalamount)
if(balance>=amount)
balance-=amount;
returntrue;
)
Console.WriteLine(HWithdrawfailed.**);
returnfalse;
}
publicoverridestringToString()
(
returnString.Format("JupiterBankSaver:Balance={0,6:C}",balance);
)
)
可見,這兩個(gè)實(shí)現(xiàn)類多繼承了IBankAccount接口,因此它們必須要實(shí)現(xiàn)接口中的所有聲明的方法。
要不然,編譯就會(huì)出錯(cuò)。讓我們來測試一下,下面是測試代碼:
staticvoidMain(string[]args)
(
IBankAccountvenusAccount=newSaverAccount();
IBankAccountjupiterAccount=newCurrentAccount();
venusAccount.PayIn(200);
jupiterAccount.PayIn(500);
Console.WriteLine(venusAccount.ToString());
jupiterAccount.PayIn(400);
jupiterAccount.Withdraw(500);
jupiterAccount.Withdraw(100);
Console.WriteLine(jupiterAccount.ToString());
)
請(qǐng)注意開頭兩句,我們把它們聲明為IBankAccount引用的方式,而沒有聲明為類的引用,為什么呢?
因?yàn)?,這樣我們就可以讓它指向執(zhí)行這個(gè)接口的任何類的實(shí)例了,比較靈活。但這也有個(gè)缺點(diǎn),如果我們
要執(zhí)行不屬于接口的方法,比如這里重載的ToString()方法,就要先把接口的引用強(qiáng)制轉(zhuǎn)換成合適的類型
了。
接口的繼承
接口也可以彼此繼承,就象類的繼承一樣。比如我們又聲明一個(gè)接口ITransferBankAccount,它繼
承于IBankAccount接口。
interfaceITransferBankAccount:IBankAccount
(
boolTransferTo(IBankAccountdestination,decimalamount);
)
在這個(gè)接口中,乂新增加了?個(gè)方法TransferTo(),所以如果我們要寫個(gè)類從
ITransferBankAccount繼承的話,就必須要實(shí)現(xiàn)IBankAccount和ITransferBankAccount兩個(gè)接口
所有的方法聲明。即:
classCurrentAccount:ITransferBankAccount
口s
privatedecimalbalance;
publicdecimalBalance
returnbalance;
publicvoidPayln(decimalamount)
由由(
balance+=amount;
卜}
publicboolWithdraw(decimalamount)
(
if(balance>=amount)
(
balance-=amount;
returntrue;
)
Console.WriteLine(,'Withdrawfailed.");
returnfalse;
publicoverridestringToString()
由由
returnString.Format("JupiterBankSaver:Balance={0,6:C}balance);
publicboolTransferTo(IBankAccountdestination,decimalamount)
(
if(Withdraw(amount))
(
destination.Payln(amount);
returntrue;
else
由由
returnfalse;
}
卜}
L}
總結(jié)起來說,使用C#接口應(yīng)注意兒個(gè)問題:
1、C#中的接口是獨(dú)立于類來定義的。這與C++模型是對(duì)立的,在C++中接口實(shí)際上就是抽象基
類。
2、接口和類都可以繼承多個(gè)接口。
3,類可以繼承一個(gè)基類,接口根本不能繼承類。這種模型避免了C++的多繼承問題,C++中不同
基類中的實(shí)現(xiàn)可能出現(xiàn)沖突。因此也不再需要諸如虛擬繼承和顯式作用域這類復(fù)雜機(jī)制。C#的簡化接口模
型有助于加快應(yīng)用程序的開發(fā)。
4、一個(gè)接口定義一個(gè)只有抽象成員的引用類型。C#中一個(gè)接口實(shí)際所做的,僅僅只存在著方法標(biāo)志,
但根本就沒有執(zhí)行代碼。這就暗示了不能實(shí)例化一個(gè)接口,只能實(shí)例化一個(gè)派生自該接口的對(duì)象。
5、接口可以定義方法、屬性和索引。所以,對(duì)比一個(gè)類,接口的特殊性是:當(dāng)定義一個(gè)類時(shí),可以派
生自多重接口,而你只能可以從僅有的一個(gè)類派生。
C#事件(event)解析
事件(event),這個(gè)詞兒對(duì)于初學(xué)者來說,往往總是顯得有些神秘,不易弄懂。而這些東西卻往往又
是編程中常用且非常重要的東西。大家都知道windows消息處理機(jī)制的重要,其實(shí)C#事件就是基于
windows消息處理機(jī)制的,只是封裝的更好,讓開發(fā)者無須知道底層的消息處理機(jī)制,就可以開發(fā)出強(qiáng)大
的基于事件的應(yīng)用程序來。
先來看看事件編程有哪些好處。
在以往我們編寫這類程序中,往往采用等待機(jī)制,為了等待某件事情的發(fā)生,需要不斷地檢測某些判斷變
量,而引入事件編程后,大大簡化了這種過程:
-使用事件,可以很方便地確定程序執(zhí)行順序。
-當(dāng)事件驅(qū)動(dòng)程序等待事件時(shí),它不占用很多資源。事件驅(qū)動(dòng)程序與過程式程序最大的不同就在于,程序
不再不停地檢查輸入設(shè)備,而是呆著不動(dòng),等待消息的到來,每個(gè)輸入的消息會(huì)被排進(jìn)隊(duì)列,等待程序處理
它。如果沒有消息在等待,則程序會(huì)把控制交回給操作系統(tǒng),以運(yùn)行其他程序。
-事件簡化了編程。操作系統(tǒng)只是簡單地將消息傳送給對(duì)象,由對(duì)象的事件驅(qū)動(dòng)程序確定事件的處理方法。
操作系統(tǒng)不必知道程序的內(nèi)部工作機(jī)制,只是需要知道如何與對(duì)象進(jìn)行對(duì)話,也就是如何傳遞消息。
有了這么多好處,看來我們的確有必要掌握它。俗話說:“難了不會(huì),會(huì)了不難,就讓我們一步,步
開始吧…
要講事件,必然要講到委托(delegate)。它們之間的關(guān)系可以通過一個(gè)淺顯的比方來說明,這個(gè)比方
可能不是十分恰當(dāng)。比如你要租一個(gè)房屋,這是一個(gè)事件,那么委托就是房屋租賃中介,當(dāng)你把租房子的
消息告知中介后,中介就會(huì)產(chǎn)生出一套符合你要求的房屋租賃方案來。再由中介執(zhí)行這套方案,你便租得
了這個(gè)房屋,即事件被處理了。當(dāng)然你也可以不通過中介,直接找房東,但如果沒有互聯(lián)網(wǎng)等工具,你如
何得到誑出租房屋的信息?話題扯遠(yuǎn)了。
委托(delegate)
委托可以理解成為函數(shù)指針,不同的是委托是面向?qū)ο?,而且是類型安全的。關(guān)于委托的理解,可以參考
我的另?篇文章《C#委托之個(gè)人理解》。
事件(event)
我們可以把事件編程簡單地分成兩個(gè)部分:事件發(fā)生的類(書面上叫事件發(fā)生器)和事件接收處理的
類。事件發(fā)生的類就是說在這個(gè)類中觸發(fā)了?個(gè)事件,但這個(gè)類并不知道哪個(gè)個(gè)對(duì)象或方法將會(huì)加收到并
處理它觸發(fā)的事件。所需要的是在發(fā)送方和接收方之間存在一個(gè)媒介。這個(gè)媒介在.NETFramework中就
是委托(delegate)。在事件接收處理的類中,我們需要有一個(gè)處理事件的方法。好了,我們就按照這個(gè)順
序來實(shí)現(xiàn)一個(gè)捕獲鍵盤按鍵的程序,來一步一步說明如何編寫事件應(yīng)用程序。
1,首先創(chuàng)建一個(gè)自己的EventArgs類。
引自MSDN:
EventArgs是包含事件數(shù)據(jù)的類的基類,此類不包含事件數(shù)據(jù),在事件引發(fā)時(shí)不向事件處理程序傳遞狀態(tài)
信息的事件會(huì)使用此類。如果事件處理程序需要狀態(tài)信息,則應(yīng)用程序必須從此類派生個(gè)類來保存數(shù)據(jù)。
因?yàn)樵谖覀冩I盤按鍵事件中要包含按鍵信息,所以要派生一個(gè)KeyEventArgs類,來保存按鍵信息,好讓
后面知道按了哪個(gè)鍵。
internalclassKeyEventArgs:EventArgs
0El{
privatecharkeyChar;
publicKeyEventArgs(charkeyChar):base()
內(nèi)由(
this.keyChar=keyChar;
卜}
publiccharKeyChar
(
get
(
returnkeyChar;
2、再創(chuàng)建一個(gè)事件發(fā)生的類KeylnputMonitor,這個(gè)類用于監(jiān)控鍵盤按鍵的輸入并觸發(fā)一個(gè)事件:
internalclassKeylnputMonitor
I//創(chuàng)建一個(gè)委托,返回類型為void,兩個(gè)參數(shù)
publicdelegatevoidKeyDownHandler(objectsender,KeyEventArgse);
//將創(chuàng)建的委托和特定事件關(guān)聯(lián),在這里特定的事件為KeyDown
publiceventKeyDownHandlerKeyDown;
IpublicvoidRun()
的{
boolfinished=false;
do
由由(
Console.WriteLine("Inputachar-");
stringresponse=Console.ReadLine();
charresponseChar=(response=="")?'':char.ToUpper(response[
0]);
switch(responseChar)
由由{
caseX:
finished=true;
break;
default:
〃得到按鍵信息的參數(shù)
KeyEventArgskeyEventArgs=newKeyEventArgs(responseChar);
//觸發(fā)事件
KeyDown(this,keyEventArgs);
break;
卜)
}while((finished);
卜)
L)
這里注意KeyDown(this,KeyEventArgs);一句,這就是觸發(fā)事件的語句,并將事件交由
KeyDownHandler這個(gè)委托來處理,委托指定事件處理方法去處理事件,這就是事件接收方的類的事
情了。參數(shù)this是指觸發(fā)事件的對(duì)象就是本身這個(gè)對(duì)象,keyEventArgs包含了按鍵信息。
3、最后創(chuàng)建一個(gè)事件接收方的類,這個(gè)類先產(chǎn)生一個(gè)委托實(shí)例,再把這個(gè)委托實(shí)例添加到產(chǎn)生事件對(duì)象的
事件列表中去,這個(gè)過程又叫訂閱事件。然后提供一個(gè)方法回顯按鍵信息。
internalclassEventReceiver
日叫
publicEventReceiver(KeylnputMonitormonitor)
白由(
//產(chǎn)生?個(gè)委托實(shí)例并添加到KeylnputMonitor產(chǎn)生的事件列表中
monitor.KeyDown+=newKeylnputMonitor.KeyDownHandler(this.OnKey
Down);
卜)
privatevoidOnKeyDown(objectsender,KeyEventArgse)
點(diǎn)由(
//真正的事件處理函數(shù)
Console.WriteLine("Capturekey:{0}",e.KeyChar);
卜}
4
4、看一下如何調(diào)用
publicclassMainEntryPoint
日叫
publicstaticvoidStart()
白由(
//實(shí)例化一個(gè)事件發(fā)送器
KeylnputMonitormonitor=newKeylnputMonitor();
//實(shí)例化一個(gè)事件接收器
EventReceivereventReceiver=newEventReceiver(monitor);
//運(yùn)行
monitor.Run();
卜}
I
總結(jié):
C#中使用事件需要的步驟:
1.創(chuàng)建一個(gè)委托
2.將創(chuàng)建的委托與特定事件關(guān)聯(lián)(.Net類庫中的很多事件都是已經(jīng)定制好的,所以他們也就有相應(yīng)的一個(gè)
委托,在編寫關(guān)聯(lián)事件處理程序一也就是當(dāng)有事件發(fā)生時(shí)我們要執(zhí)行的方法的時(shí)候我們需要和這個(gè)委托有
相同的簽名)
3.編寫事件處理程序
4.利用編寫的事件處理程序生成一個(gè)委托實(shí)例
5.把這個(gè)委托實(shí)例添加到產(chǎn)生事件對(duì)象的事件列表中去,這個(gè)過程又叫訂閱事件
C#中事件產(chǎn)生和實(shí)現(xiàn)的流程:
1.定義A為產(chǎn)生事件的實(shí)例,a為A產(chǎn)生的一個(gè)事件
2.定義B為接收事件的實(shí)例,b為處理事件的方法
3.A由于用戶(程序編寫者或程序使用者)或者系統(tǒng)產(chǎn)生一個(gè)a事件(例如點(diǎn)擊一?個(gè)Button,產(chǎn)生一個(gè)Click
事件)
4.A通過事件列表中的委托對(duì)象將這個(gè)事件通知給B
5.B接到一個(gè)事件通知(實(shí)際是B.b利用委托來實(shí)現(xiàn)事件的接收)
6.調(diào)用B.b方法完成事件處理
publicclassA
(
publicdelegatevoidEventHandler(objectsender);
publiceventEventHandlera;
publicvoidRun()
Console.WriteLine("Triggeranevent.'*);
a(this);
)
)
classB
(
publicB(Aa)
(
a.a+=newA.EventHandler(this.b);
)
privatevoidb(objectsender)
(
Console.WriteLine("Receivedandhandledanevent.");
Console.Read();
)
)
不當(dāng)之處,歡迎指正。
C#委托之個(gè)人理解
什么是委托
首先要知道什么是委托,用最通俗易懂的話來講,你就可以把委托看成是用來執(zhí)行方法(函數(shù))的一
個(gè)東西。
如何使用委托
在使用委托的時(shí)候,你可以像對(duì)待一個(gè)類一樣對(duì)待它。即先聲明,再實(shí)例化。只是有點(diǎn)不同,類在實(shí)
例化之后叫對(duì)象或?qū)嵗?,但委托在?shí)例化后仍叫委托。
聲明,如:
1namespaceVczx.ProCSharp.Exc
2日國(
3IdelegatedoubleMathsOp(doublex);
4I//classdefinationhere--
5L)
這就聲明了一個(gè)委托,意義:任何一個(gè)返回值為double,且只有一個(gè)形參為double的函數(shù),都可以
用這個(gè)委托來調(diào)用。
注意:委托的聲明位置在namespace里面,類的外而°其實(shí),委托的聲明也可以在類的里面,甚至
是任何一個(gè)可以聲明類的地方。
實(shí)例化:
首先我們要先有個(gè)滿足委托聲明的方法,假設(shè)?個(gè)返回個(gè)數(shù)的2倍的方法:
1classMathsOperations
2日田{
3IpublicstaticdoubleMultiplyBy2(doublevalue)
4由力(
5Ireturnvalue*2;
6卜)
7L)
有了這樣?個(gè)方法,我們就可以實(shí)例化一個(gè)委托了:
MathsOpoperation=newMathsOp(MathsOperations.MultiplyBy2);
在實(shí)例化一個(gè)委托時(shí),要給它一個(gè)參數(shù),這個(gè)參數(shù)就是委托執(zhí)行的方法,它可以是靜態(tài)方法,也可以
是實(shí)例方法(這一點(diǎn)有別于函數(shù)指針,函數(shù)指針只能調(diào)用靜態(tài)方法),如:
MathsOpoperation=newMathsOp(newClassi().Methodi);
在實(shí)例化完個(gè)委托之后,就可以用這個(gè)委托來調(diào)用方法了:
doubleresult=operation(1.23);
例子代碼:
1namespaceVczx.ProCSharp.Exc
2日國{
3IdelegatedoubleMathsOp(doublex);
4IclassStart
5由由{
6IpublicclassMyDelegate
7白由{
8IpublicstaticdoubleMultiplyBy2(doublex)
9白由{
10Ireturnx*2;
111}
12I-)
13I[STAThread]
14IstaticvoidMain(string[]args)
15白由{
16IMathsOpoperation=newMathsOp(MyDelegate.MultiplyBy2);
17Idoublex=1.23;
18Idoubleresult=operation(x);
_
19
_Console.WriteLine("{0}multiplyby2is{1}",x,result);
20_
LConsole.Read();
21I
L)
22I
L)
23
多路廣播委托
前而使用的委托只包含一個(gè)方法調(diào)用。調(diào)用委托的次數(shù)與調(diào)用方法的次數(shù)相同。如果要調(diào)用多個(gè)方
法,就需要多次顯示調(diào)用這個(gè)委托。其實(shí)委托也可以包含多個(gè)方法,這種委托就是多路廣播委托。多路廣
播委托派生于System.MulticastDelegate,它的Combine方法允許把多個(gè)方法調(diào)用鏈接在?起,我們
可以通過+=來向委托添加調(diào)用方法,也可以用?=刪除其中的調(diào)用方法。如:
1namespaceVczx.ProCSharp.Exc
2日國{
3IpublicclassMyDelegate
4白由(
5IpublicstaticvoidMultiplyBy2(doublevalue)
6白由{
7Idoubleresult=value*2;
8IConsole.WriteLine("Multiplyingby2:{0}gives{1}value,result);
9卜)
10I
11IpublicstaticvoidSqure(doublevalue)
12白由(
13Idoubleresult=value*value;
14IConsole.WriteLine("Squaring:{0}gives{1}",value,result);
15I-)
16I-)
17I
18IdelegatevoidMathsOp(doublex);
19I
20IclassStart
21白由(
22I[STAThread]
23IstaticvoidMain(string[]args)
24白由(
25IMathsOpoperation=newMathsOp(MyDelegate.MuItiplyBy2);
26Ioperation+=newMathsOp(MyDelegate.Squre);
27Idoublex=1.23;
28Ioperation(x);
29I
30Ioperation-=newMathsOp(MyDelegate.MultiplyBy2);
31Ioperation(x);
32I
33IConsole.Read();
34I-)
35I-)
36L}
輸出:
Multiplyingby2:1.23gives2.46
Squaring:1.23gives1.5129
Squaring:1.23gives1.5129
注意,多路廣播委托聲明時(shí)必須返回void,否則返回值不知道應(yīng)該送回什么地方。對(duì)此,我做了一個(gè)
測試:如果不將委托的聲明返回void,則返回值返回的是最后?個(gè)鏈入委托鏈的方法的返回值,編譯不會(huì)
出錯(cuò)。
為什么要用委托
使用委托使程序員可以將方法引用封裝在委托對(duì)象內(nèi)。然后可以將該委托對(duì)象傳遞給可調(diào)用所引用方
法的代碼,而不必在編譯時(shí)知道將調(diào)用哪個(gè)方法。與C或C++中的函數(shù)指針不同,委托是面向?qū)ο?,?/p>
且是類型安全的。
C#中web.config文件詳解
一、認(rèn)識(shí)Web.config文件
Web.config文件是…個(gè)XML文本文件,它用來儲(chǔ)存ASP.NETWeb應(yīng)用程序的配置信息(如
最常用的設(shè)置ASP.NETWeb應(yīng)用程序的身份驗(yàn)證方式),它可以出現(xiàn)在應(yīng)用程序的每一個(gè)目錄
中。當(dāng)你通過.NET新建一個(gè)Web應(yīng)用程序后,默認(rèn)情況下會(huì)在根目錄自動(dòng)創(chuàng)建一個(gè)默認(rèn)的
Web.config文件,包括默認(rèn)的配置設(shè)置,所有的子目錄都繼承它的配置設(shè)置。如果你想修改子目
錄的配置設(shè)置,你可以在該子目錄下新建一個(gè)Web.config文件。它可以提供除從父目錄繼承的
配置信息以外的配置信息,也可以重寫或修改父目錄中定義的設(shè)置。
在運(yùn)行時(shí)對(duì)Web.config文件的修改不需要重啟服務(wù)就可以生效(注:vprocessModeb*節(jié)例外)。
當(dāng)然Web.config文件是可以擴(kuò)展的。你可以自定義新配置參數(shù)并編寫配置節(jié)處理程序以對(duì)它們
進(jìn)行處理。
web.config配置文件(默認(rèn)的配置設(shè)置)以下所有的代碼都應(yīng)該位于
<configuration>
<system.web>
和
</system.web>
</configuration>
之間,出于學(xué)習(xí)的目的下面的示例都省略了這段XML標(biāo)記。
1><authentication>節(jié)
作用:配置ASP.NET身份驗(yàn)證支持(為Windows、Forms>PassPort>None四種)。該元素只
能在計(jì)算機(jī)、站點(diǎn)或應(yīng)用程序級(jí)別聲明。〈authentication,元素必需與〈authorization〉節(jié)配合使
用。
示例:
以下示例為基于窗體(Forms)的身份驗(yàn)證配置站點(diǎn),當(dāng)沒有登陸的用戶訪問需要身份驗(yàn)證的網(wǎng)
頁,網(wǎng)頁自動(dòng)跳轉(zhuǎn)到登陸網(wǎng)頁。
<authenticationmode=',Forms,'>
<formsloginUrl=,,logon.aspx,*name=u.FormsAuthCookie*7>
</authentication>
其中元素loginUrl表示登陸網(wǎng)頁的名稱,name表示Cookie名稱。
2、<authorization>節(jié)
作用:控制對(duì)URL資源的客戶端訪問(如允許匿名用戶訪問)。此元素可以在任何級(jí)別(計(jì)算
機(jī)、站點(diǎn)、應(yīng)用程序、子目錄或頁)上聲明。必需與〈authentication〉節(jié)配合使用。
示例:以下示例禁止匿名用戶的訪問
<authorization>
<denyusers=',?,7>
</authorization>
注:你可以使用來獲取已經(jīng)過驗(yàn)證的當(dāng)前的用戶名;可以使用
web.Security.FormsAuthentication.RedirectFromLoginPage方法將已驗(yàn)證的用戶重定向到用戶剛才
請(qǐng)求的頁面.具體的
3、〈compilation〉節(jié)
作用:配置ASP.NET使用的所有編譯設(shè)置。默認(rèn)的debug屬性為"rue”.在程序編譯完成交付使
用之后應(yīng)將其設(shè)為False(Web.config文件中有詳細(xì)說明,此處省略示例)
4、<customErrors>
作用:為ASP.NET應(yīng)用程序提供有關(guān)自定義錯(cuò)誤信息的信息。它不適用于XMLWebservices
中發(fā)生的錯(cuò)誤。
示例:當(dāng)發(fā)生錯(cuò)誤時(shí),將網(wǎng)頁跳轉(zhuǎn)到自定義的錯(cuò)誤頁面。
<customErrorsdefaultRedirect="ErrorPage.aspx"mode="RemoteOnly">
</customErrors>
其中元素defaultRedirect表示自定義的錯(cuò)誤網(wǎng)頁的名稱。mode元素表示:對(duì)不在本地Web服務(wù)
器上運(yùn)行的用戶顯示自定義(友好的)信息。
5、<httpRuntime>節(jié)
作用:配置ASP.NETHTTP運(yùn)行庫設(shè)置。該節(jié)可以在計(jì)算機(jī)、站點(diǎn)、應(yīng)用程序和子目錄級(jí)別聲
明。
示例:控制用戶上傳文件最大為4M,最長時(shí)間為60秒,最多請(qǐng)求數(shù)為100
<httpRuntimemaxRequestLength="4096"executionTimeout="60"appRequestQueueLimit="100"/>
6,<pages>
作用:標(biāo)識(shí)特定于頁的配置設(shè)置(如是否啟用會(huì)話狀態(tài)、視圖狀態(tài),是否檢測用戶的輸入等)。
<pages>可以在計(jì)算機(jī)、站點(diǎn)、應(yīng)用程序和子目錄級(jí)別聲明。
示例:不檢測用戶在瀏覽器輸入的內(nèi)容中是否存在潛在的危險(xiǎn)數(shù)據(jù)(注:該項(xiàng)默認(rèn)是檢測,如果
你使用了不檢測,一要對(duì)用戶的輸入進(jìn)行編碼或驗(yàn)證),在從客戶端回發(fā)頁時(shí)將檢查加密的視圖
狀態(tài),以驗(yàn)證視圖狀態(tài)是否已在客戶端被篡改。(注:該項(xiàng)默認(rèn)是不驗(yàn)證)
<pagesbuffer="true"enableViewStateMac="true"validateRequest="false"/>
7、<sessionState>
作用:為當(dāng)前應(yīng)用程序配置會(huì)話狀態(tài)設(shè)置(如設(shè)置是否啟用會(huì)話狀態(tài),會(huì)話狀態(tài)保存位置)。
示例:
<sessionStatemode=MInProc"cookieless=Htrue"timeout="20n/>
</sessionState>
注:
mode="InProc”表示:在本地儲(chǔ)存會(huì)話狀態(tài)(你也可以選擇儲(chǔ)存在遠(yuǎn)程服務(wù)器或SAL服務(wù)器中或
不啟用會(huì)話狀態(tài))
cookieless="true”表示:如果用戶瀏覽器不支持Cookie時(shí)啟用會(huì)話狀態(tài)(默認(rèn)為False)
limeout="2(T表示:會(huì)話可以處于空閑狀態(tài)的分鐘數(shù)
8、<trace>
作用:配置ASP.NET跟蹤服務(wù),主要用來程序測試判斷哪里出錯(cuò)。
示例:以下為Web.config中的默認(rèn)配置:
<traceenabled="falseMrequestLimit=n10npageOutput=nfalseHtraceMode=',SortByTime,,
localOnly=Mtruen/>
注:
enabled="false”表示不啟用跟蹤;
requestLimil="10”表示指定在服務(wù)器上存儲(chǔ)的跟蹤請(qǐng)求的數(shù)目
pageOutput="false”表示只能通過跟蹤實(shí)用工具訪問跟蹤輸出;
traceMode="SortByTime”表示以處理跟蹤的順序來顯示跟蹤信息
localOnly=Mtrue"表示跟蹤查看器(trace.axd)只用于宿主Web服務(wù)器
自定義Web.config文件配置
自定義Web.config文件配置節(jié)過程分為兩步。
1.在在配置文件頂部vconfiigSections>和v/configSections>標(biāo)記之間聲明配置節(jié)的名稱和處理
該節(jié)中配置數(shù)據(jù)的.NETFramework類的名稱。
2.是在<conflgSeclions>區(qū)域之后為聲明的節(jié)做實(shí)際的配置設(shè)置。
示例:創(chuàng)建一個(gè)節(jié)存儲(chǔ)數(shù)據(jù)庫連接字符串
<configuration>
<configSections>
<sectionname=',appSettingsHtype=',System.Configuration.NameValueFileSectionHandler,System,
Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089,7>
</configSections>
<appSettings>
<addkey="scon"value=nserver=a;database=northwind;uid=sa;pwd=123H/>
</appSettings>
<system.web>
</system.web>
</configuration>
訪問Web.config文件
你可以通過使用Configurationsettings.AppSettings靜態(tài)字符串集合來訪問Web.config文件示
例:獲取上面例子中建立的連接字符串。例如:
protectedstaticstringIsdebug=Configurationsettings.AppSettings[ndebugnJ
二、web.config中的session配置詳解
打開某個(gè)應(yīng)用程序的配置文件Web.config后,我們會(huì)發(fā)現(xiàn)以下這段:
<sessionState
mode="InProc"
stateConnectionString=utcpip=:42424"
sqlConnectionString='*datasource=;Trusted_Connection=yesn
cookieless="falseM
timeout=M20H
這一段就是配置應(yīng)用程序是如何存儲(chǔ)Session信息的了。我們以下的各種操作主要是針對(duì)這
一段配置展開。讓我們先看看這一段配置中所包含的內(nèi)容的意思。sessionState節(jié)點(diǎn)的語法是這
樣的:
<sessionStatemode="OfflInProclStateServerlSQLServer,,
cookieless=utruelfalseH
timeout="numberofminutes'*
stateConnectionString=,,tcpip=server:portn
sqlConnectionString=,,sqlconnectionstring"
stateNetworkTimeout=unumberofseconds"
/>
必須有的屬性是
屬性選項(xiàng)描述
mode設(shè)置將Session信息存儲(chǔ)到哪里
0Off設(shè)置為不使用Session功能,
0InProc設(shè)置為將Session存儲(chǔ)在進(jìn)程內(nèi),就是ASP中的存儲(chǔ)方式,這是默認(rèn)值,
0StateServer設(shè)置為將Session存儲(chǔ)在獨(dú)立的狀態(tài)服務(wù)中,
0SQLServer設(shè)置將Session存儲(chǔ)在SQLServer中。
可選的屬性是:
屬性選項(xiàng)描述
0cookieless設(shè)置客戶端的Session信息存儲(chǔ)到哪里,
0ture使用Cookieless模式,
0false使用Cookie模式,這是默認(rèn)值,
0timeout設(shè)置經(jīng)過多少分鐘后服務(wù)器自動(dòng)放棄Session信息,默認(rèn)為20分鐘。
stateConnectionString設(shè)置將Session信息存儲(chǔ)在狀態(tài)服務(wù)中時(shí)使用的服務(wù)器名稱和端口號(hào),例
如:"tcpip=:42424”。當(dāng)mode的值是StateServer是,這個(gè)屬性是必需的。
sqlConnectionString設(shè)置與SQLServer連接時(shí)的連接字符串。例如"datasource=
localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind"o當(dāng)mode的值是SQLServer時(shí),這
個(gè)屬性是必需的。
stateNetworkTimeout設(shè)置當(dāng)使用StateServer模式存儲(chǔ)Session狀態(tài)時(shí),經(jīng)過多少秒空閑后,斷開
Web服務(wù)器與存儲(chǔ)狀態(tài)信息的服務(wù)器的TCP/IP連接的。默認(rèn)值是10秒鐘。
ASP.NET中客戶端Session狀態(tài)的存儲(chǔ)
在我們上面的Session模型簡介中,大家可以發(fā)現(xiàn)Session狀態(tài)應(yīng)該存儲(chǔ)在兩個(gè)地方,分別
是客戶端和服務(wù)器端??蛻舳酥回?fù)責(zé)保存相應(yīng)網(wǎng)站的SessionlD,而其他的Session信息則保存在
服務(wù)器端。在ASP中,客戶端的SessionlD實(shí)際是以Cookie的形式存儲(chǔ)的。如果用戶在瀏覽器
的設(shè)置中選擇了禁用Cookie,那末他也就無法享受Session的便利之處了,甚至造成不能訪問某
些網(wǎng)站。為了解決以上問題,在ASP.NET中客戶端的Session信息存儲(chǔ)方式分為:Cookie和
Cookieless兩種。
ASP.NET中,默認(rèn)狀態(tài)下,在客戶端還是使用Cookie存儲(chǔ)Session信息的。如果我們想在
客戶端使用Cookieless的方式存儲(chǔ)Session信息的方法如下:
找到當(dāng)前Web應(yīng)用程序的根目錄,打開Web.Config文件,找到如下段落:
<sessionState
mode="InProc,,
stateConnectionString=utcpip=:42424"
sqlConnectionString=udatasource=;Trusted_Connection=yesH
cookieless="false"
timeout=M20u
/>
這段話中的cookieless="false”改為:cookieless=HtrueH,這樣,客戶端的Session信息就不再
使用Cookie存儲(chǔ)了,而是將其通過URL存儲(chǔ)。關(guān)閉當(dāng)前的IE,打開一個(gè)新IE,重新訪問剛才
的Web應(yīng)用程序,就會(huì)看到類似下面的樣子:
其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑體標(biāo)出的就
是客戶端的SessionID。注意,這段信息是由1IS自動(dòng)加上的,不會(huì)影響以前正常的連接。
ASP.NET中服務(wù)器端Session狀態(tài)的存儲(chǔ)
準(zhǔn)備工作:
為了您能更好的體驗(yàn)到實(shí)驗(yàn)現(xiàn)象,您可以建立一個(gè)叫做SessionSlale.aspx的頁面,然后把以
卜這些代碼添力口至lj<bodyx/body〉中。
<scriptrunat="server">
SubSession_Add(senderAsObject,eAsEventArgs)
Session("MySession")=text1.Value
spanl.InnerHtml="Sessiondataupdated!<P>Yoursessioncontains:<fontcolor=red>H&
Session("MySessionn).ToStringO&M</font>"
EndSub
SubCheckSession(senderAsObject,eAsEventArgs)
If(Session(MMySession")IsNothing)Then
spanl.InnerHtml="NOTHING,SESSIONDATALOST!"
Else
spanl.InnerHtml="Yoursessioncontains:<fontcolor=red>H&
Session(,,MySession,').ToString()&H</font〉”
EndIf
EndSub
</script>
<formrunat="server11id="Form2u>
<inputid=Htextr'type=,'textHrunat="server"name=',textl">
<inputtype二"submirTunat="server”O(jiān)nServerClick="Session_AdcT
value="AddtoSessionStatenid=HSubmitr,name=,,Submitr,>
<inputtype="submitHrunat=,,server,,OnServerClick=,'CheckSession"
value="ViewSessionState"id=,"Submit2"name="Submit2'>>
</form>
<hrsize=n1*'>
<fontsize="6"><spanid="span1"runat="server"/></font>
這個(gè)SessionState.aspx的頁面可以用來測試在當(dāng)前的服務(wù)器上是否丟失了Session信息。
將服務(wù)器Session信息存儲(chǔ)在進(jìn)程中
讓我們來回到Web.config文件的剛才那段段落中:
<sessionState
mode="InProc"
stateConnectionString=utcpip=:42424M
sq!ConnectionString=udatasource=;Trusted_Connection=yes"
cookieless="false"
timeout=M20u
/>
當(dāng)mode的值是InProc時(shí),說明服務(wù)器正在使用這種模式。
這種方式和以前ASP中的模式一樣,就是服務(wù)器將Session信息存儲(chǔ)在IIS進(jìn)程中。當(dāng)IIS
關(guān)閉、重起后,這些信息都會(huì)丟失。但是這種模式也有自己最大好處,就是性能最高。應(yīng)為所有
的Session信息都存儲(chǔ)在了IIS的進(jìn)程中,所以IIS能夠很快的訪問到這些信息,這種模式的性能
比進(jìn)程外存儲(chǔ)Session信息或是在SQLServer中存儲(chǔ)Session信息都要快上很多。這種模式也是
ASP.NET的默認(rèn)方式。
好了,現(xiàn)在讓我們做個(gè)試驗(yàn)。打開剛才的SessionSlale.aspx頁面,隨便輸入一些字符,使其
存儲(chǔ)在Session中。然后,讓我們讓HS重起。注意,并不是使當(dāng)前的站點(diǎn)停止再開始,而是在
ns中本機(jī)的機(jī)器名的節(jié)點(diǎn)上點(diǎn)擊鼠標(biāo)右鍵,選擇重新啟動(dòng)ns。(想當(dāng)初使用NT4時(shí),重新啟動(dòng)
IIS必須要重新啟動(dòng)計(jì)算機(jī)才行,微軟真是@#$%八&)返回到SessionSlale.aspx頁面中,檢查剛才
的Session信息,發(fā)現(xiàn)信息已經(jīng)丟失了。
將服務(wù)器Session信息存儲(chǔ)在進(jìn)程外
首先,讓我們來打開管理工具,服務(wù),找到名為:ASP.NETStateService的服務(wù),啟動(dòng)它。
實(shí)際上,這個(gè)服務(wù)就是啟動(dòng)一個(gè)要保存Session信息的進(jìn)程。啟動(dòng)這個(gè)服務(wù)后,你可以從Windows
任務(wù)管理器,進(jìn)程中看到一個(gè)名為aspnet_state.exe的進(jìn)程,這個(gè)就是我們保存Session信息的進(jìn)
程。
然后,回到Web.config文件中上述的段落中,將mode的值改為StateServer。保存文件后的
重新打開一個(gè)IE,打開SessionState.aspx頁面,保存一些信息到Session中。這時(shí),讓我們重起
IIS,再回到SessionState.aspx頁面中查看剛才的Session信息,發(fā)現(xiàn)沒有丟失。
實(shí)際上,這種將Session信息存儲(chǔ)在進(jìn)程外的方式不光指可以將信息存儲(chǔ)在本機(jī)的進(jìn)程外,
還可以將Session信息存儲(chǔ)在其他的服務(wù)器的進(jìn)程中。這時(shí)、不光需要將mode的值改為
StateServer,還需要在stateConnectionString中配置相應(yīng)的參數(shù)。例如你的計(jì)算你是,
你想把Session存儲(chǔ)在IP為的計(jì)算機(jī)的進(jìn)程中,就需要設(shè)置成這樣:
stateConnectionString="tcpip=:42424"?當(dāng)然,不要忘記在的計(jì)算機(jī)中裝
上.NETFramework.并且啟動(dòng)ASP.NETStateServices服務(wù)。
將服務(wù)器Session信息存儲(chǔ)在SQLServer中
首先,還是讓我們來做一些準(zhǔn)備工作。啟動(dòng)SQLServer和SQLServer代理服務(wù)。在SQLServer
中執(zhí)行一個(gè)叫做InstallSqlState.sql的腳本文件。這個(gè)腳本文件將在SQLServer中創(chuàng)建一個(gè)用來
專門存儲(chǔ)Session信息的數(shù)據(jù)庫,及--個(gè)維護(hù)Session信息數(shù)據(jù)庫的SQLServer代理作業(yè)。我們
可以在以下路徑中找到那個(gè)文件:
[systemdrive]\winnt\Microsoft.NET\Framework\[version]\
然后打開查詢分析器,連接到SQLServer服務(wù)器,打開剛才的那個(gè)文件并且執(zhí)行。稍等片
刻,數(shù)據(jù)庫及作業(yè)就建立好了。這時(shí),你可以打開企業(yè)管理器,看到新增了一個(gè)叫ASPState的
數(shù)據(jù)庫。但是這個(gè)數(shù)據(jù)庫中只是些存儲(chǔ)過程,沒有用戶表。實(shí)際上Session信息是存儲(chǔ)在了tempdb
數(shù)據(jù)庫的ASPStateTempSessions表中的,另外一^ASPStateTempApplications表存儲(chǔ)了ASP中
Application對(duì)象信息。這兩個(gè)表也是剛才的那個(gè)腳本建立的。另外查看管理。SQLServer代理:
作業(yè),發(fā)現(xiàn)也多了一-個(gè)叫做ASPState_Job_DeleteExpiredSessions的作業(yè),這個(gè)作業(yè)實(shí)際上就是每
分鐘去ASPStateTempSessions表中刪除過期的Session信息的。
接著,我們返回到Web.config文件,修改mode的值改為SQLServer。注意,還要同時(shí)修改
sqlConnectionString的值,格式為:
sqlConnectionString="datasource=localhost;IntegratedSecurity=SSPI;"
其中datasource是指SQLServer服務(wù)器的IP地址,如果SQLServer與HS是一臺(tái)機(jī)子,寫
就行了。IntegratedSecurity=SSPI的意思是使用Windows集成身份驗(yàn)證,這樣,訪問
數(shù)據(jù)庫將以ASP.NET的身份進(jìn)行,通過如此配置,能夠獲得比使用userid=sa;password=口令的
SQLServer驗(yàn)證方式更好的安全性。當(dāng)然,如果SQLServer運(yùn)行于另一-臺(tái)計(jì)算機(jī)上,你可能會(huì)
需要通過ActiveDirectory域的方式來維護(hù)兩邊驗(yàn)證的一致性。
同樣,讓我們做個(gè)試驗(yàn)。向SessionState.aspx中添加Session信息,這時(shí)發(fā)現(xiàn)Session信息已
經(jīng)存在SQLServer中了,即使你重起計(jì)算機(jī),剛才的Session信息也不會(huì)丟失?,F(xiàn)在,你已經(jīng)
完全看見了Session信息到底是什么樣子的了,而且又是存儲(chǔ)在SQLServer中的,能干什么就看
你的發(fā)揮了。
總結(jié)
通過這篇文章,你可以看到在Session的管理和維護(hù)上,ASP.NET比ASP有了很大的進(jìn)步,
我們可以更加隨意的挑選適合的方法了。對(duì)于企業(yè)級(jí)的應(yīng)用來說,這無疑對(duì)于服務(wù)器的同步、服
務(wù)器的穩(wěn)定性、可靠性都是有利的。相信在強(qiáng)大的微軟支持下,新一代的電子商務(wù)平臺(tái)將會(huì)搭建
的更好!
同時(shí),大家也會(huì)發(fā)現(xiàn),在這個(gè)整個(gè)技術(shù)中包括了操作系統(tǒng)、Web服務(wù)及數(shù)據(jù)庫多種技術(shù)的
整合。我相信,也許Windows沒有Unix穩(wěn)定,HS沒有Apache穩(wěn)定,SQLServer也沒有Oracle
強(qiáng)大,但是,誰可以將他們?nèi)绱送昝赖穆?lián)動(dòng)到一起呢?所以說,雖然微軟每一方面都不是太強(qiáng),
但是如果把微軟的東西都整合到一起,誰敢說他不強(qiáng)大呢?微軟就是微軟!
三、Asp.net關(guān)于form認(rèn)證的一般設(shè)置
關(guān)于form認(rèn)證的一般設(shè)置:
1:在web.config中,加入form認(rèn)證;
<authenticationmode=MFormsu>
<formsname=MauthuloginUrl=uindex.aspxHtimeout=H30u></forms>
</authentication>
<authorization>
<denyusers="?H/>
</authorization>
2:如果有注冊(cè)頁面時(shí)還應(yīng)該允許匿名用戶調(diào)用注冊(cè)頁面進(jìn)行注冊(cè);
以下代碼應(yīng)該在vconfiguration>vsystem.web><^jMI,而不應(yīng)該包含到vsystem.web>..</system.web>
之間;
表示允許匿名用戶對(duì)userReg.aspx頁面進(jìn)行訪問.
<locationpath=,'userReg.aspxH>
<system.web>
<authorization>
<allowusers="?H/>
</authorization>
</system.web>
</location>
3在登錄成功后要?jiǎng)?chuàng)建身份驗(yàn)證票,表明已經(jīng)通過認(rèn)證的合法用戶;
if(登陸成功)
System.Web.Security.FormsAuthentication.SetAuthCookie(用戶名稱,false);
.NET大全
用.net做B/S結(jié)構(gòu)的系統(tǒng),您是用幾層結(jié)構(gòu)來開發(fā),每一層之間的關(guān)系以及為什么要這樣分層?
答:
從下至上分別為:數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層(又或成為領(lǐng)域?qū)樱⒈硎緦?/p>
數(shù)據(jù)訪問層:有時(shí)候也稱為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫的訪問
業(yè)務(wù)邏輯層:是整個(gè)系統(tǒng)的核心,它與這個(gè)系統(tǒng)的業(yè)務(wù)(領(lǐng)域)有關(guān)
表示層:是系統(tǒng)的UI部分,負(fù)責(zé)使用者與整個(gè)系統(tǒng)的交互。
優(yōu)點(diǎn):分工明確,條理清晰,易于調(diào)試,而且具有可擴(kuò)展性。
缺點(diǎn):增加成本。
分層式結(jié)構(gòu)究竟其優(yōu)勢何在?
1、開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;
2、可以很容易的用新的實(shí)現(xiàn)來替換原有層次的實(shí)現(xiàn);
3、可以降低層與層之間的依賴;
4、有利于標(biāo)準(zhǔn)化;
5、利于各層邏輯的復(fù)用-
概括來說,分層式設(shè)計(jì)可以達(dá)至如下目的:分散關(guān)注、松散耦合、邏輯復(fù)用、標(biāo)準(zhǔn)定義。
分層式結(jié)構(gòu)也不可避免具有一些缺陷:
1、降低了系統(tǒng)的性能。這是不言而喻的。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫,以此獲
取相應(yīng)的數(shù)據(jù),如今卻必須通過中間層來完成。
2,有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能,為
保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需耍在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層中都增加相應(yīng)的代碼。
MVC模式
MVC(Model-View-Controller)把交互系統(tǒng)的組成分解成模型、視圖、控制器三種部件
MVC的優(yōu)點(diǎn):
1、通過把項(xiàng)目分成modelview和controller,使得復(fù)雜項(xiàng)目更加容易維步,
2、沒有使用viewstate和服務(wù)器表單控件,可以更方便的控制應(yīng)用程序的行為
3、應(yīng)用程序通過controller來控制程序請(qǐng)求,可以提供豐富的url重寫。
4、對(duì)單元測試的支持更加出色
5、在團(tuán)隊(duì)開發(fā)模式下表現(xiàn)更出眾
MVC的不足:
(1)增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性。對(duì)于簡單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,
會(huì)增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運(yùn)行效率。
<2)視圖與控制器間的過于緊密的連接。視圖與控制器是相互分離,但確實(shí)聯(lián)系緊密的部件,視圖沒有控
制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨(dú)立重用。
(3)視圖對(duì)模型數(shù)據(jù)的低效率訪問。依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯
示數(shù)據(jù)。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。
歹U舉ASP.NET頁面之間傳遞值的幾種方式。
1.使用QueryString,如….?id=1;response.Redirect()
2.使用Session變量
3.使用Server.Transfer
請(qǐng)說明在met中常用的幾種頁面間傳遞參數(shù)的方法,并說出他們的優(yōu)缺點(diǎn)。
Querystring傳遞?個(gè)或多個(gè)安全性要求不高或是結(jié)構(gòu)簡單的數(shù)值。但是對(duì)于傳遞數(shù)組或?qū)ο蟮脑挘?/p>
不能用這個(gè)方法了session(viewstate)簡單,但易丟失作用于用戶個(gè)人,過量的存儲(chǔ)會(huì)導(dǎo)致服務(wù)器內(nèi)存
資源的耗盡。
application對(duì)象的作用范圍是整個(gè)全局,也就是說對(duì)所有用戶都有效。其常用的方法用Lock和UnLock
cookie簡單,但可能不支持,可能被偽造Cookie是存放在客戶端的,而session是存放在服務(wù)器端的。
而且Cookie的使用要配合ASP.NET內(nèi)置對(duì)象Request來使用inputttype="hidden"簡單,可能被偽
造url參數(shù)簡單,顯示于地址欄,長度有限
Server.Transfer把流程從當(dāng)前頁面引導(dǎo)到另一個(gè)頁面中,新的頁面使用前一個(gè)頁面的應(yīng)答流
數(shù)據(jù)庫穩(wěn)定,安全,但性能相對(duì)弱
什么是Viewstate?它有什么作用?
ViewState用來保存頁面狀態(tài),就是說提交之后我們還可以看到文本框里面的內(nèi)容就是ViewState保存
的功勞。
ViewState只維護(hù)當(dāng)前頁面的狀態(tài),不同頁面之間不能共享,Session可以。
ViewState你可以理解為一個(gè)隱藏控件。
ASP.Net頁面生命周期
每個(gè)頁面的生命周期為用戶的每?次訪問,也就是說每?次客戶端與服務(wù)器之間的?個(gè)往返過程.全局變量
的生命周期在此之間.
1.Page_lnit();
2.LoadViewStateandPostbackdata;
3.Page_Load();
4.Handlecontrolevents;
5.Page_PreRender();
6.Page_Render();
7.Unloadevent;
8.Disposemethodcalled;
ADO.net中常用的對(duì)象有哪些?分別描述一下。
Connection打開數(shù)據(jù)庫連接
Command執(zhí)行數(shù)據(jù)庫命令
DataAdapter連接數(shù)據(jù),執(zhí)行數(shù)據(jù)庫命令,填充DataSet
DataSet數(shù)據(jù)隹內(nèi)存中的緩存,數(shù)據(jù)結(jié)構(gòu)
DataReader只讀向前的讀取數(shù)據(jù)庫
DataReader和DataSet的異同
DataReader使用時(shí)始終占用SqlConnection,在線操作:數(shù)據(jù)庫..任何對(duì)SqlConnection的操作都會(huì)引發(fā)
DataReader的異常..因?yàn)镈ataReader每次只在內(nèi)存中加載一條數(shù)據(jù),所以占用的內(nèi)存是很小的..因?yàn)?/p>
DataReader的特殊性和高性能.所以DataReader是只進(jìn)的..你讀了第?條后就不能再去讀取第一條了..
DataSet則是將數(shù)據(jù)一次性加載在內(nèi)存中.拋棄數(shù)據(jù)庫連接..讀取完畢即放棄數(shù)據(jù)庫連接..因?yàn)镈ataSet
將數(shù)據(jù)全部加載在內(nèi)存中.所以比較消耗內(nèi)存…但是確比DataReader要靈活..可以動(dòng)態(tài)的添加行,列,數(shù)據(jù).
對(duì)數(shù)據(jù)庫進(jìn)行回傳更新操作…
存儲(chǔ)過程和sql語句的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.提高性能,減少網(wǎng)絡(luò)傳輸,節(jié)約時(shí)間.
2.減少網(wǎng)絡(luò)流量存儲(chǔ)過程位于服務(wù)器上,調(diào)用的時(shí)候只須傳遞存儲(chǔ)過程的名稱以及參數(shù),不用每次訪問
都傳遞很長的sql語句。
4.安全性減少sql注入式攻擊。
5.可維護(hù)性高更新存儲(chǔ)過程通常比更改、測試以及重新部署程序集需要較少的時(shí)間和精力。
缺點(diǎn):
1.交互性差?
2.可移植性差
說出你所了解的數(shù)據(jù)庫訪問組件(例如AD。,至少4種)
答:ADO,ADO.Net,MDAC(MicrosoftDataAccessComponents),MicrosoftSQLServerOLEDB
Provider,
MicrosoftJetOLEDBProvider,DesktopDatabaseDriversODBCDriver,VisualFoxProODBC
Driver
什么是面向?qū)ο?/p>
萬物都是對(duì)象,其主要特征:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國射頻翻頁激光筆數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國大風(fēng)量過濾器數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國半導(dǎo)體信號(hào)燈數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國加合混凝土砌塊數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國五香蹄筋數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國個(gè)性化人像水晶數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025年中國鉑金鉆石女戒市場調(diào)查研究報(bào)告
- 2025年中國管制試劑瓶市場調(diào)查研究報(bào)告
- 2025年中國磁酶免發(fā)光試劑市場調(diào)查研究報(bào)告
- 購物中心裝修安全協(xié)議摘要
- 五年級(jí)下冊(cè)數(shù)學(xué)課內(nèi)每日計(jì)算小紙條
- 2024年度中國寵物行業(yè)研究報(bào)告
- 工業(yè)自動(dòng)化控制系統(tǒng)升級(jí)與維護(hù)服務(wù)合同
- 定崗定編定員實(shí)施方案(5篇)
- 藥品經(jīng)營質(zhì)量管理規(guī)范
- 爆破工程師培訓(xùn)
- 2024年云南省公務(wù)員考試《行測》真題及答案解析
- 教科版初中物理八年級(jí)下冊(cè)知識(shí)梳理
- 《飛科電器公司盈利能力存在的問題及完善對(duì)策(7800字論文)》
- 零星維修工程項(xiàng)目施工方案1
- 楚辭離騷的原文全文完整注音版、拼音版標(biāo)準(zhǔn)翻譯譯文及注釋
評(píng)論
0/150
提交評(píng)論