2019年12月30日 星期一

[IIS 懶人包] ASP.NET 開發人員不可不知的 IIS - [轉]

ASP.NET開發人員不可不知的 IIS 

各位開發夥伴們:
常常在研討會或是與.NET 開發者對談時,了解到開發人員對於 Web 應用伺服器 IIS (Internet Information Services) 較陌生,導致很多工作仍土法鍊鋼或硬用程式的方式解決。你只會在 IIS 中建立站台、或虛擬目錄嗎? 許多 IIS 的元件及設定,無需撰寫程式,讓你的應用程式開發馬上飛了起來,例如效能提升、安全設定等,這些都是開發人員應該要認識的 IIS!也會提到如何善用 Azure 雲平台更方便開發人員進行開發、測試及佈署。本文可算是給開發者一個深入淺出了解 IIS,讓你的開發工作更快更便利,你也可以觀看以下線上影片!
註1:想了解 MSDN 採購優惠方案,可參考這裏!
註2 : 本文內容 - IIS 7.0 - 8.5 版本皆適用
作者: 微軟 MVP 朱明中
前言
IIS (Internet Information Services) 一直是微軟Windows平台上唯一由官方發展的Web伺服器,經過Windows NT至2012 R2等伺服器作業系統版本的演進,IIS本身已發展得十分成熟,不論是核心的穩定度,或是對於Web應用程式的支援程度,都在在顯示出IIS作為Windows平台上的Web伺服器領導地位。
IIS在7.0開始改變核心架構後,不斷在IIS伺服器內添加許多新功能,使得IIS 7.0+ (表示IIS 7.0以及更新版本) 的附加價值不斷提升,多數以往要寫程式才可做到的功能,在IIS 7.0+上變得只要懂得設定就可以達到,不過身為ASP.NET開發人員的您,是否有真正了解IIS 7.0+所提供的功能?而本文將給您一個簡單的導覽,讓您可以知道IIS 7.0+有哪些好用的模組。

IIS 的基本管理

當您在電腦中安裝IIS後,在系統管理工具(Windows Server 2012起為伺服器管理員) 中可找到Internet Information Services管理員,若您沒有用過IIS 7.0+,看到它的管理介面會有種眼睛一亮的感覺。
IIS 7.0+的組態設定可分為伺服器級(對所有網站有效) 以及網站級 (針對某個網站有效) 的設定方式,在伺服器的管理功能內所做的設定,都會以繼承的方式反應在所有網站內,所以Web伺服器管理員可以在伺服器端對所有的網站進行設定,尤其是與安全有關的。當一開始安裝好IIS時,可能無法看到所有的模組,因為部份模組沒有內建在安裝來源內,必須利用IIS內的Web Platform Installer (Web PI) 來安裝。
 
Web Platform Installer 內的產品伺服器分類包含了IIS的擴充模組、懶人包 (例如IIS建議的設定) 以及其他與Web平台有關的伺服器套件,如果不想要花時間去過濾的話,可以在右上的文字框中輸入IIS,即可列舉出能用在IIS的懶人包及擴充套件。
 

每個網站的組態分為兩種,一種是網站本身的組態,這個可在每個網站內的基本設定以及進階設定中進行,網站的設定會決定網站使用哪些通訊協定(HTTP/HTTPS)、驗證的方式、流量控制以及記錄的模式等。另一個是網站所屬的應用程式集區 (application pool),應用程式集區的設定會影響網站如何執行,包括使用的帳戶、預設的回收設定、32/64位元執行模式、使用的.NET Framework版本以及是否使用IIS 6.0相容模式 (即傳統模式),是網站架設時很重要的一個部份。

記錄模組

 IIS 7.0+的記錄功能以W3C以及IIS等不同的記錄模組提供,預設的情況下只會安裝W3C的記錄模組,若要安裝像ODBC記錄的功能,則要額外到新增/移除Windows元件 (Windows Server 2012起為伺服器管理員) 內添加,管理員可在伺服器或網站的管理員中,在IIS的功能群內找到記錄的功能:
 記錄模組可允許管理員選擇要記錄的欄位以及要記錄的行為,在IIS 8.5時不但可以記錄原本的W3C格式資料,還可以進一步的記錄要求的各種資訊,包含來源標頭、回應標頭以及伺服器變數。
IIS 8.5除了新增允許管理者自訂要求、回應與伺服器變數外,還增加了和Event Tracing for Windows (ETW)的支援,能將IIS的事件記錄寫到Windows內的事件資料收集器內,而系統管理員即可利用這個資料收集器進行監控與管理的工作。
若是IIS 8.0或更早版本的使用者,由於尚未支援8.5的要求、回應標頭資料的記錄,因此無法使用,不過可以利用Advanced Logging模組來實作相似的能力。Advanced Logging 是一個掛在 IIS 核心功能中的模組,它可以接收來自於伺服器(server)以及網站(site)中各式各樣的記錄,並且再經過由管理人員定義的過濾器(filter)篩選之後寫入到磁碟機中成為記錄檔,目前Advanced Logging可以支援下列三種記錄方式: 
Client Logging:支援用戶端使用經驗的記錄,包含使用 Smooth Streaming 的串流影音觀賞,以及Silverlight 3.0+的使用者操作經驗。
Realtime Logging:支援來自IIS模組的即時訊息記錄,這個必須要由IIS模組在開發時期時就設定輸出Trace訊息時才會生效。
Custom Logging:支援由管理者自行設定條件以及記錄資料類型的記錄。
若要深入了解Advanced Logging的功能,可參考本篇文章:http://www.microsoft.com/taiwan/technet/iis/expand/AdvancedLogging.aspx

安全模組

 Web應用程式的安全性一直以來都是被業界重視的資訊安全類型之一,針對Web安全性研究而設立的OWASP協會也會不定期的公告十大Web安全問題,目前已經是作為預防或設計Web應用程式安全機制時的重要參考,IIS自然不會忽略掉這個問題,所以IIS 7.0+除了核心的改良外,也針對了安全機制做了許多設計,並發展出數個模組,這些模組能輔助Web伺服器管理員或開發人員對應用程応的安全做更多的控制。
要求過濾 (Request Filtering) 是安全模組中的重要模組,它可以在核心層次對所有流入IIS的HTTP資料流進行條件過濾,若發現要求內有被封鎖或不符合規則的要求時,即會直接拒絕,不會讓它流進Web應用程式內,確保應用程式處於安全的環境內。
 
要求篩選支援下列格式的篩選:
l   副檔名:可針對特定的副檔名進行封鎖,不允許用戶端瀏覽。
l   規則:可設定針對特定副檔名進行要求的標頭過濾,若發現有符合拒絕的內容時,即將要求擋下。
l   隱藏區段:可設定網站內的特定資料夾 (或特定的路徑字串),在發現要求中包含了這些字串時,將要求擋下。
l   URL:針對特定的URL序列進行封鎖,或是允許特定的URL進入。
l   指令動詞:針對要求所使用的動詞 (GET/POST或其他) 進行過濾。
l   查詢字串:針對查詢字串的內容進行過濾。
要求過濾除了能夠針對上述的功能進行過濾設定外,還可以針對內容的長度以及URL的長度等進行過濾,並且設定上述功能在未加入新設定的情況下的預設行為為何。這個可在功能設定內進行設定:
 關於 Request Filtering的詳細說明可參考:http://www.iis.net/learn/manage/configuring-security/use-request-filtering
另一個與資安有關的問題是,如何限制Web應用程式只能由特定的用戶端瀏覽,這個需求可透過IP位址及網域限制的功能來達成,IP位址可支援單一位址或是位址區間,並可明確設定允許或拒絕,而在未設定時的預設行為,也可以透過功能區的設定來處理。
靜態位址好處理,但以往讓管理員更頭痛的問題是如何處理浮動的IP位址,在IIS 7.5時微軟提供了Dynamic IP Restriction模組,用來處理浮動IP位址的限制需求,到IIS 8.0之後,這個模組即成為內建模組,不過IIS 7.0和7.5的使用者仍然可以透過Web PI來安裝這個外掛到IIS內。透過動態IP的功能設定,我們可以要求IIS針對短時間內發送要求數量過多的用戶端IP進行封鎖,以阻擋DDoS (分散式服務阻斷) 攻擊手法,並且可設定要封鎖IP的週期條件 (在多少時間內發送多少要求)。這以往都要用寫程式的方式控制,現在利用IIS本身提供的模組,就不再需要編寫程式去控制了。
針對URL的部份,除了現階段由ASP.NET 4.0所提供的URL Routing可實作出URL Rewriting的功能外,針對現有無法改變的網站,微軟提供了URL Rewrite模組供開發人員使用,透過 URL Rewrite 模組,不論是靜態或動態的網頁,都可以被轉換成親民的 URL,而且對內部而言它也不會受到外部 URL 的影響,URL Rewrite 會自動將連入要求的 URL 轉換成程式可讀的內部 URL,以讓程式可以保持正常執行。

URL Rewrite 目前支援五種 URL Rewriting 的設定:

l   空白規則:由管理人員自行設定 URL Rewriting 的規則,這個功能的彈性是最大的。
l   易記 URL:由管理人員利用內建的 URL Rewriting 範本來建立親民的URL。
l   具重寫對應的規則:Rewrite Map 是一種規則定義的集合,這個功能可以直接利用現有的 Rewrite Map 來設定重寫的規則。
l   要求封鎖:由管理人員設定 URL Rewriting 的規則,只要符合就擲回 HTTP 的錯誤狀態碼。
l   強制小寫URL:在輸出時強制將URL轉換成小寫字元,以強化網站的SEO。
其中以易記URL的使用率較高,它以較簡單的規則方式替開發人員產生新的URL,並自動將URL的參數對應到所設定的URL查詢字串內。
想要了解更多URL Rewrite模組的功能,可參考 http://www.microsoft.com/taiwan/technet/iis/expand/URLRewrite.aspx

效能提升

IIS 7.0+除了在核心部份持續改良外,也針對中大型的網站應用提供了數個輔助提升效能的模組,首先是針對大型應用程式,在啟動時可能就需要載入或處理大量資料,以致於第一個使用者 (或數個使用者) 可能要等待更多的時間才能看到回應的內容,IIS在7.5的時代提供了Application Warm-Up模組,這個模組可在IIS啟動網站當時就發出一個要求,驅動應用程式先進行初始化,以加快第一個使用者看到內容的時間。這個功能在IIS 8.0起被改稱為Application Initialization模組,並內建在網站的功能內,和Application Warm-Up模組不同的是,它的設定方式是在網站的進階設定功能內的預先啟動功能: 
除了啟用預先載入外,還必須要到這個網站使用的應用程式集區的進階設定內,設定啟動模式為AlwaysRunning,這樣才會在應用程式啟動時,觸發應用程式的第一個要求。
若要了解Application Warm-Up模組,可參考:http://www.microsoft.com/taiwan/technet/iis/expand/ApplicationWarmUp.aspx
另外,針對大型應用程式可能的集區回收 (Pool Recycling),IIS 8.5提供了Idle Worker Process的機制,管理員可設定網站的應用程式集區在達到回收的Timeout時,進入不完全釋放記憶體的暫止模式 (Suspend Mode),以避免因重新冷啟動 (cold start) 而出現的效能損耗。這個設定在應用程式集區的進階設定功能內,將集區逾時動作設為Suspend即可。
 
與大型應用程式相對的,就是小型應用程式,但在一台IIS上掛載過多的小型應用程式,對伺服器的負擔其實也不小,所以IIS的核心層在8.5時做了改良,只有在接收到真正的要求時,才會真正啟動應用程式,這可以節省流量較小的網站所用到的記憶體。

 結語

本文介紹了IIS 7.0+所提供的基本功能以及數個可用來輔助應用程式開發人員處理安全性、記錄以及效能的常用模組,以最少的時間及不用寫程式的方式來達到原先可能要花較多時間寫程式處理的需求。當然IIS還不只有這些而已,包含應用程式集區的架構以及驗證與授權的基本概念都十分重要。
更多的IIS相關資訊可以到下列網站取得:
全球IIS官方網站:http://www.iis.net

2019年2月13日 星期三

javaScript / jQuery

取某元素下的子元素 / 將值寫入陣列與讀取陣列

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>

function data(name){
          var v_arr = new Array(); //宣告一個新的陣列
          var n = $(name).children().length;
          for(var i=0;i<n;i++){
                    var v_child = $(name).children().eq(i);
                    v_arr[i] = v_child.attr("id"); //存入陣列
          }
         
          //判斷是否為陣列
          /*if(Array.isArray(v_arr)){
                    alert('Y');
          }*/
         
          //迴圈取出陣列值
          var str = '';
          var l = v_arr.length;
          for(var i=0; i<l; i++){
                    //document.write(v_arr[i]);
                    str += v_arr[i] + ",";
          }

          $("#datatxt").html(str);
}

解決iOS系統下點返上一頁不刷新

/*解決iOS系統下點返上一頁不刷新;
 (pageshow只使用於ios10以上)*/
var browserRule = /^.*((iPhone)|(iPad)|(Safari))+.*$/;
if (browserRule.test(navigator.userAgent)) {
    window.onpageshow = function (event) {
        if (event.persisted) {
            window.location.reload()
        }
    };
}


禁止瀏覽器點選回上一頁

history.forward(); //禁止回上一頁


JavaScript 偵測 Request 來自瀏覽器的 Go Back (回到上一頁)

//$(function () {
    if (!!window.performance && window.performance.navigation.type == 2) {
        //!! 用來檢查 window.performance 是否存在
        //window.performance.navigation.type ===2 表示使用 back or forward
        //console.log('Reloading');
        alert(window.performance.navigation.type);
        //window.location.reload();//或是其他動作
    }
//})

2019年1月10日 星期四

VB 陣列

二維陣列

Dim arrColumn(,) As String = {{"DOCNO", "合約編號"}, {"BU_NAME", "事業群"}, {"COMPANY_CNAME", "公司別"}}


For i As Integer = 0 To arrColumn.GetLength(0) - 1
       xxx.Text += arrColumn(i, 0) & "<br>"
Next



取值方法:(其他範例)
Module Example Public Sub Main() Dim numbers As Integer(,) = GetNumbersMultidim() ShowNumbersMultidim(numbers) End Sub Private Function GetNumbersMultidim() As Integer(,) Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}} Return numbers End Function Private Sub ShowNumbersMultidim(numbers As Integer(,)) For index0 = 0 To numbers.GetUpperBound(0) For index1 = 0 To numbers.GetUpperBound(1) Console.Write($"{numbers(index0, index1)} ") Next Console.WriteLine() Next End Sub End Module