cNET面試大全及難點(diǎn)講解_第1頁
cNET面試大全及難點(diǎn)講解_第2頁
cNET面試大全及難點(diǎn)講解_第3頁
cNET面試大全及難點(diǎn)講解_第4頁
cNET面試大全及難點(diǎn)講解_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論