ASP.NET 應懂的相關基礎與簡答

由 Derek 發表於 七月 22, 2011 / 尚無評論

 

 

C#部份

0. 基礎語法

    基本型別,時間物件, 時間比較, 字串, 整數, 浮點數  (常用語法整理),生命週期,web.config 連線字串設定

bool:true/false

string: ""

string.Format("{0}{1}",var1,var2);

decimal price = 120M  //小數以下可達28位

float,byte,char

int: int? age = null; //可允許空值

命名規則: A-Z a-z _

列舉關鍵字 : protected, private, public, void,class,

     DateTime.Now

DateTime.Now.DayOfWeek; //星期幾

DateTime.Now.DayOfWeek.GetHashCode(); //傳回雜湊碼 星期天=>0 ~ 星期六=>6 

DateTime Dt = new DateTime(2011,01,01,12,00,00);   

DateTime EndDt = new DateTime(2011,07,31,12,00,00);

DateTime.Now.CompareTo(EndDt);// 現在時間 大於EndDt => 1  相等=>0 小於=>-1

 

路徑: Request.PhysicalApplicationPath; 實體路徑

      Request.ApplicationPath 應用程式路徑

加密: 

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("123456", "MD5");

 

生命週期:

Application: BeginRequest

Application: PreAuthenticateRequest

Application: AuthenticateRequest

Application: PostAuthenticateRequest

Application: PreAuthorizeRequest

Application: AuthorizeRequest

Application: PostAuthorizeRequest

Application: PreResolveRequestCache

Application: ResolveRequestCache

Application: PostResolveRequestCache

Application: PreMapRequestHandler

Page: Construct

Application: PostMapRequestHandler

Application: PreAcquireRequestState

Application: AcquireRequestState

Application: PostAcquireRequestState

Application: PreRequestHandlerExecute

Page: AddParsedSubObject

Page: CreateControlCollection

Page: AddedControl

Page: AddParsedSubObject

Page: AddedControl

Page: ResolveAdapter

Page: DeterminePostBackMode

Page: PreInit

Control: ResolveAdapter

Control: Init

Control: TrackViewState

Page: Init

Page: TrackViewState

Page: InitComplete

Page: LoadPageStateFromPersistenceMedium

Control: LoadViewState

Page: EnsureChildControls

Page: CreateChildControls

Page: PreLoad

Page: Load

Control: DataBind

Control: Load

Page: EnsureChildControls

Page: LoadComplete

Page: EnsureChildControls

Page: PreRender

Control: EnsureChildControls

Control: PreRender

Page: PreRenderComplete

Page: SaveViewState

Control: SaveViewState

Page: SaveViewState

Control: SaveViewState

Page: SavePageStateToPersistenceMedium

Page: SaveStateComplete

Page: CreateHtmlTextWriter

Page: RenderControl

Page: Render

Page: RenderChildren

Control: RenderControl

Page: VerifyRenderingInServerForm

Page: CreateHtmlTextWriter

Control: Unload

Control: Dispose

Page: Unload

Page: Dispose

Application: PostRequestHandlerExecute

Application: PreReleaseRequestState

Application: ReleaseRequestState

Application: PostReleaseRequestState

Application: PreUpdateRequestCache

Application: UpdateRequestCache

Application: PostUpdateRequestCache

Application: EndRequest

Application: PreSendRequestHeaders

Application: PreSendRequestContent 

 

Web.Config 基本設定

連線字串 跟<system.web>同階

<connectionStrings>

         <add name="cn" connectionString="Data Source=ServerName ;Initial Catalog=DatabaseName; User ID=UserName;Password=p@ssw0rd;" providerName="System.Data.SqlClient"/>

     </connectionStrings>

 

GridView 事件 : 

RowCreated :  建立 GridView 控制項中的資料列時發生。

//e.Row:取得所建立或繫結(Binding)到資料的資料列。

         //e.Row.Cells(i):i是數值,存取資料列的第i個儲存格。

         //e.Row.RowType:在執行作業之前判斷資料列的型別。

 

RowCommand : 按一下 GridView 控制項中的按鈕時發生。

'e.CommandName有些內建關鍵字,會引發特定行為與事件

         'e.CommandName:取得自訂按鈕命令名稱

         'e.CommandArgument:取得自訂按鈕命令引數

         'e.CommandSource:存取引發事件的按鈕控制項

 

RowDataBound : 資料列繫結(Binding)至 GridView 控制項中的資料時發生。

               控制項中的每個資料列必須都繫結(Binding)至資料來源中的資料錄,才能呈現 GridView  控制項。資料列 (由 GridViewRow  物件表示) 繫結(Binding)至 GridView 控制項中的資料時,會引發 RowDataBound 事件。這可讓您提供事件處理方法,用於每次發生這個事件時執行自訂常式,例如修改繫結(Binding)至資料列之資料的值。GridViewRowEventArgs 物件會傳遞至事件處理方法,讓您存取正在繫結(Binding)之資料列的屬性。若要存取資料列中的特定儲存格,請使用 GridViewRowEventArgs 物件的 Cells 屬性。您可以使用 RowType 屬性決定繫結(Binding)那種資料列型別 (標頭資料列、資料列等)。

'e.Row:取得所建立或繫結(Binding)到資料的資料列。

         'e.Row.Cells(i):i是數值,存取資料列的第i個儲存格。

         'e.Row.RowType:在執行作業之前判斷資料列的型別。

         '1. DataRow:GridView 控制項中的資料列。(常用)

         '2. Footer:GridView 控制項的頁尾資料列。

         '3. Header:GridView 控制項的標頭資料列。

         '4. EmptyDataRow:GridView 控制項中的空白資料列。

         '5. Pager:GridView 控制項中的頁面巡覽列。

         '6. Separator:GridView 控制項中的分隔列。

 

RowDeleting : 按一下資料列的 [刪除] 按鈕時發生 (但在 GridView 控制項刪除資料列之前)。

'e.Keys:取得欲刪除那筆資料的PK值。查看DataKeyNames屬性,就可以知道PK值有那些。

         'e.Cancel:Boolean,True表示取消刪除動作。

         'e.Values:取得要刪除那筆資料的"欄位值"

         'e.RowIndex:目前要刪除這筆資料在GridView中的索引值。注意,Index及PK是不同東西。Index指的是排序順序,另外GridView有啟用分頁,假設每頁10筆,則第2頁第一筆資料的RowIndex是0非10。

 

RowEditing : 按一下資料列的 [更新] 按鈕時發生 (但在 GridView 控制項更新資料列之前)。

'e.Keys:取得欲更新那筆資料的PK值。

         'e.Cancel:True表示取消更新動作。

         'e.OldValues:取得更新那筆資料,除了PK欄位之外的原始值。

         'e.NewValues:取得欲更新那筆資料,除了PK欄位之外的更新值。

        'e.RowIndex:目前要更新這筆資料在GridView中的索引值。

 

RowUpdated : 按一下資料列的 [更新] 按鈕時發生 (但在 GridView 控制項更新資料列之後)。

e.AffectedRows:更新筆數。

        'e.Keys:取得欲更新那筆資料的PK值。

         'e.OldValues:取得更新那筆資料,除了PK欄位之外的原始值。

         'e.NewValues:取得欲更新那筆資料,除了PK欄位之外的更新值。

         'e.KeepInEditMode:Boolean,是否讓GridView維持在編輯模式。

         'e.Exception:若更新發生例外,可透過e.Exception取得例外相關資訊。

         'e.ExceptionHandled:Boolean,當例外發生且e.ExceptionHandled沒有為True時,會值接在網頁上顯示例外的錯誤畫面。

 

SelectedIndexChanging : 按一下資料列的 [選取] 按鈕時發生 (但在 GridView 控制項處理選取作業之前)。

Sorting : 按一下排序資料行的超連結時發生 (但在 GridView 控制項處理排序作業之前)。

MasterPage <asp:ContentPlaceHolder> 和ContentPage <asp:Content>之間的路徑關係:

一般ASPNET中使用~/ 絕對路徑可省去許多路徑

相對路徑之間的關係:

一般MasterPage中的HTML<img>以目標ContentPage 也就是最後合併的那隻.asp為切入點做相對路徑,但若加入runat="server" 改為伺服器控制項 則變成 已本來程式所在的檔案 MasterPage為點.

Mail相關

//建立 SmtpClient 物件 並設定 Gmail的smtp主機及Port 

System.Net.Mail.SmtpClient MySmtp = new System.Net.Mail.SmtpClient("smtp.gmail.com", 587);

//設定你的帳號密碼

MySmtp.Credentials = new System.Net.NetworkCredential("YourID", "YourPassword");

  //Gmial 的 smtp 使用 SSL

MySmtp.EnableSsl = true;

//發送Email

MySmtp.Send("發送者<sender@gmail.com>", "收件者<receiver@gmail.com>", "C# Gmail發信測試", "文件內容");

 

Cookie Session Application ViewState

COOKIE : 將資料紀錄於Client 端,使用者是否能使用 cookies 看瀏覽器是否支援。Client端最多可以同時擁有 300 個 cookies,同一個Domain最多只能建立 20 個 cookies 給一台Client 電腦。 每筆 cookies 最大只能到 4K。在使用者瀏覽含有 cookies 的網頁時,瀏覽器會將 cookies 暫存於記憶體中,當瀏覽器結束執行後,所有尚未到期的 cookies 都會被儲存在Client電腦裡。 

SESSION : 當使用者的Browser與Server建立連線即產生Session,功能大致上與COOKIE相同,資料儲存於Server端,不同Browser和同網站的連線也是不同Session。

IsNewSession 是否為新連線 SessionID Timeout

Application : 整個網站共用的狀態,共享資料.

 

ViewState : 使用網頁上隱藏的欄位來存狀態. ViewState["x"] = "SomeInformation";

Request.IsLocal Request.Url Request.UserLanguages Request.UserHostName Request.Browser

網頁追蹤:在檔頭加入Trace="true" 

1. 實作.axd,JSON, AJAX, XML SOAP RSS ,Javascript 部份。

何謂Web Resource?

內嵌資源檔,通常將JS,CSS,圖片等靜態資源內嵌的HTTP Handler. 其檔案格式為.axd

使用方式:1. 設定該圖檔屬性為內嵌資源 2. 設定AssemblyInfo.cs 中 [assembly: WebResource("專案名稱.目錄.檔案名稱.jpg", "image/jpeg")]

 3. 圖片來源使用<%= ClientScript.GetWebResourceUrl(typeof(專案名稱.頁面class),@"專案名稱.目錄.檔案名稱.jpg")%>

 

AJAX : Asynchronous JavaScript and XML (非同步的JavaScript 和 XML)

運用XHTML+CSS來表達資訊;

運用JavaScript操作DOM(Document Object Model)執行動態效果;

運用XML和XSLT進行資料交換及操作;

運用XMLHttpRequest為Agent與網頁伺服器進行非同步資料交換;

運用JavaScript技術實現。

JSON : JavaScript Object Notation 使用JS物件陣列方式的宣告方式取代繁瑣的XML標籤宣告。一種輕量況的資料傳輸格式,

       使用時機如前端需要將資料帶回後端驗證或從後端取的後續處理資訊。

 

SOAP : Simple Object Access Protocol 簡單物件存取協定

WebService : 透過網址呼叫Method,讓不同的應用程式可以交流. 使用 標頭指示詞 <%@ WebService Language="C#" Class="DemoWebService"%>

     定義class和method給其他應用程式使用 

     example : 

[WebMethod] public int Add(int num_1, int num_2){

return num_1+num_2;

     }

使用加入Web參考即可.

API : Application Programming Interface 應用程式接口,一組程式函式庫,提供給應用程式呼叫使用的程式碼.

RSS : XML的應用,一種訂閱格式的規範格式.

Podcasting : XML的應用,一種訂閱格式的規範格式.給ipod等mp3裝置訂閱只支援mp3檔案格式.

JavaScript : 常用基礎 getDocumentID DOM jQuery Moontools 

2. 何謂User Controller?

使用於重複出現的物件集合.例如

User Control : 副檔名 .ascx 使用者控制項, 跟一般WebForm大致相同,引用時表頭宣告 : <%@ Register TagPrefix="uc" TagName="Spinner"  Src="~/UserControl.ascx" %> 

加入  <uc:Spinner id="Spinner1"  runat="server"  /> 請對照TagPrefix和TagName.

3. 實作.dll 如何使用 Codeplex 

加入參考,宣告物件. 若需要個別功能即自行開立專案->建置->所有類別會被打包在/Debug or /Release 底下

4. 請實做一個物件 class ,含有 屬性,方法

namespace CP18Class

{

    class Program

    {

        static void Main(string[] args)

        {

            Date DateMoon = new Date();

            //Date D2 = new Date();

            //DateMoon.Year = 1986;

            //DateMoon.Month = 2;

            //DateMoon.Day = 28;

 

            Console.WriteLine("Moon is {0},Day of Year : {1}",DateMoon,DateMoon.DayOfYear());

            Console.ReadLine();

        }

    }

 

    class Date

    {

        private int _year = 1;

        private int _month = 1;

        private int _day = 1;

        public Date() {

 

        }

        public Date(int _year, int _month, int _day) {

            Year = _year;

            Month = _month;

            Day = _day;

 

        }

        public int Year {

            set {

                if (!IsConsistent(value, Month, Day))

                    throw new ArgumentOutOfRangeException("Year");

                _year = value;

            }

            get {

                return _year;

            }

        }

        public int Month {

            set {

                if (!IsConsistent(Year, value, Day))

                    throw new ArgumentOutOfRangeException("Month");

                _month = value;

            }

            get { return _month; }

        }

        public int Day {

            set {

                if (!IsConsistent(Year, Month, value))

                    throw new ArgumentOutOfRangeException("Day");

                _day = value;

            }

            get { return _day; }

        }

        static bool IsConsistent(int _year,int _month, int _day) {

            if (_year < 1) return false;

 

            if (_month < 1 || _month > 12) return false;

 

            if (_day < 1 || _day > 31) return false;

 

            if (_day == 31 && (_month == 2 || _month == 4 || _month == 6 || _month == 9 || _month == 11)) return false;

 

            if (_month == 2 && _day > 29) return false;

 

            if (_month == 2 && !LeapYearCheck(_year) && _day > 28) return false;

 

            return true;      

        }

        static bool LeapYearCheck(int _year) { return _year % 4 == 0 && (_year % 400 == 0 || _year % 100 != 0); }

 

        static int[] Sum = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };

        static string[] StrMonth = { "Jan", "Feb", "Mch", "Apl", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

 

        public int DayOfYear() {

            return Sum[_month - 1] + _day + (_month > 2 && LeapYearCheck(_year) ? 1 : 0);

        }

        public override string ToString()

        {

            return String.Format("{0} {1} {2}", _day, StrMonth[_month - 1], _year);

        }

    }

}

 

5. 錯誤(Exception) 處理的程式 

try{}catch(Exception ex){}finally{}

6.舉一些方法的實例來說明方法的過載 ( Overload),以及覆寫(Override)

如上作答的Date 中的public Date()和public Date(int _year, int _month, int _day)

就是Overload,最後把ToString()覆寫掉

 

7. 物件導向觀念

存取修飾元:public,private,protected

class建立類別

className Intance = new className() 建立物件

DataMember 類別裡面宣告的變數

Method 類別內的function

Property 屬性用來處理DataMember與實務上封裝,功能類似DataMember用來存取資料.可設定唯讀唯寫等

 

8. 抽象類別(Abstract Class)和介面(Interface)有何差異?若是你在應用上會有何種差別?

抽象類別別便是在領域概念中無法具體化的類別。舉一個簡單的例子。假設有一個叫做「形狀」的類別,而「圓形」類別與「方形」類別則是「形狀」類別的子類別別。在這個例子中,「形狀」很明顯的是一種抽像的概念,並無法具體化,因此在設計時,我們便可以選擇將「形狀」定義為一個抽象類別別。

 

界面是一種可以附上在任意類別上的特徵,也是一種規範。

 

9. 實作小鍵盤

System.Diagnostics.Process.Start("c:/Windows所在的目錄/System32/osk.exe");

10. 驗證碼變化實作 Captch 

11. 專案檔和網站檔的差異

實作上差異 網站檔不可使用Web Resource

12. 實作多語系資源檔 使用.resx 為變數或文字設定不同語系

13. 正規式 : Regular Expression 用來處理特定格式文字資料

System.Text.RegularExpressions.Regex.IsMatch(strIP, RegExp)

14. 解釋Http Stateless 特性 相對 Stateful

1.不會記住(retain)之前的連線 

2.每個request都被視為是唯一且獨立的 

 

15. JS Framework  jQuery,ExtJS,Phototype,Dojo,YUI,Mootools.

 

資料庫部份

1. 何謂SP ?  stored procedure 預存程序 : 簡單說就是資料庫的副程式 CREATE PROC 建立 Exec執行

 

2. CRUD + Join Inner 等複雜的查詢

Select * From [table]

Insert Into [table] (column_1,column_2) Values (@input_1,@input_2)

Update [table] Set [column_1]=@input_1,[colume_2]=@input_2

Delete From [table] Where [Condition]=@Condition

Select DISTINCT * From [table]

Select TOP 1 * From [table]

 

3. View 與 資料表同步 觀念

4. 大量搜尋時優化

5. 正規化 

第一正規化是為了要排除 重複群 的出現,所採用的方法是要求資料庫的每個欄位都只能存放單一值,而且每筆記錄都要能利用一個惟一的主鍵來加以識別。

第二正規劃 它的規則是要求資料表裡的所有資料都要和該資料表的主鍵有完全相依關係;如果有哪些資料只和主鍵的一部份有關的話,就得把它們獨立出來變成另一個資料表。如果一個資料表的主鍵只有單一一個欄位的話,它就一定符合第二正規化。

第三正規化和第二正規化不同的地方在於,在第三正規化裡,所有的非鍵屬性都必須和每個候選鍵有直接相關。如果再對第三正規化做進一步加強就成了BC正規化,它所強調的重點就在於 "資料間的關係是奠基在鍵上、以整個鍵為考量、而且除了鍵之外不考慮其他因素"。

BCNF與第三正規化的不同之處在於,第三正規化允許A是主屬性(第三正規化中不存在非主屬性被另一個非主屬性決定),而在BCNF中,任何屬性(包括非主屬性和主屬性)都不能被非主屬性所決定。

資安部份

1. XSS 解釋防範

跨網站指令碼(Cross-site scripting,通常簡稱為XSS)是一種網站應用程式的安全漏洞攻擊,允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及使用者端腳本語言。

 

2. SQL Injection 解釋與防範

 

實務上檢測工具

 Microsoft Source Code Analyzer for SQL Injection (MSCASI) 與 URLScan 3.0。

原因

 

在應用程式中若有下列狀況,則可能應用程式正暴露在SQL Injection的高風險情況下:

在應用程式中使用字串聯結方式組合SQL指令。

在應用程式連結資料庫時使用權限過大的帳戶(例如很多開發人員都喜歡用sa(內建的最高權限的系統管理員帳戶)連接Microsoft SQL Server資料庫)。

在資料庫中開放了不必要但權力過大的功能(例如在Microsoft SQL Server資料庫中的xp_cmdshell延伸預存程式或是OLE Automation預存程式等)

太過於信任使用者所輸入的資料,未限制輸入的字元數,以及未對使用者輸入的資料做潛在指令的檢查。

 

作用原理

 

SQL命令可查詢、插入、更新、刪除等,命令的串接。而以分號字元為不同命令的區別。(原本的作用是用於SubQuery或作為查詢、插入、更新、刪除……等的條件式)

SQL命令對於傳入的字串參數是用單引號字元所包起來。〈但連續2個單引號字元,在SQL資料庫中,則視為字串中的一個單引號字元〉

SQL命令中,可以夾帶註解〈連續2個減號字元——後的文字為註解,或「/*」與「*/」所包起來的文字為註解〉

因此,如果在組合SQL的命令字串時,未針對單引號字元作取代處理的話,將導致該字元變數在填入命令字串時,被惡意竄改原本的SQL語法的作用。

 

避免的方法

 

在設計應用程式時,完全使用參數化查詢(Parameterized Query)來設計資料存取功能。

在組合SQL字串時,先針對所傳入的參數作字元取代(將單引號字元取代為連續2個單引號字元)。

如果使用PHP開發網頁程式的話,亦可開啟PHP的魔術引號(Magic quote)功能(自動將所有的網頁傳入參數,將單引號字元取代為連續2個單引號字元)。

其他,使用其他更安全的方式連接SQL資料庫。例如已修正過SQL資料隱碼問題的資料庫連接元件,例如ASP.NET的SqlDataSource物件或是 LINQ to SQL。

使用SQL防資料隱碼系統。

 

 

主機部份

1. 常用port

(1)公認port(Well Known Ports):從0到1023,一般應用於【服務】上。通常這些port的通訊明確表明了某種服務的協議規範。例如:80埠實際上總是HTTP通訊。

 

 

(2)註冊port(Registered Ports):從1024到49151。同一時間內,相同的port只能給一支程式來使用,因此程式設計師在寫程式時,要特別注意所使用的port是那個。可經由查詢IANA,看此PORT號是否有被使用。也可直接註冊,以告訴其他程式設計師此poer號有人使用,避免重覆的問題產生。

 

 

(3)動態和/或私有port(Dynamic and/or Private Ports):從49152到65535。動態的port通常應用在暫時性的使用上。例如,幾乎所有的Clinet端的應用程式都會使用動態port,Clinet端的應用程式啟動時,系統會分配一個【動態的port】給該應用程式來使用。並在使用結束後歸還此port給系統。 

 

ftp:21

ssh:22

telnet:23

smtp:25

pop3:109,110

imap4:143

dns:53

snmp:161

vnc:3389

http:80

https:443

MSSQL:1433

MySql:3306

 

2. Linux 常用指令 ifconfig , netstat, traceroute, df, mount, which, locate, grep,tail -f, ls , man. chmod : 421的意思 ,chown

3. Windows 指令 tracert ping nslookup 

 

關於作者

一個半路殺出來的傻小子,憑著一股傻勁努力的學習、嘗試、分享。希望能用自己微薄之力,替IT界和資訊界盡一點心力。單憑一己之力始終還是有限,歡迎和我有相同理念的夥伴一同加入一同努力。

評論

此文章尚無評論。

發表評論

*