只有累積,沒有奇蹟

2018年10月28日 星期日

[.NET] ASP.NET 狀態管理(State Management):Session

Session 狀態支援數種不同的資料儲存選項,簡單描述 Session 可用的狀態模式

InProc:存在Web伺服器的記憶體中;ASP.NET中預設的Session狀態設定,是最常用也是最方便的 Session 狀態模式,缺點是如果重新啟動伺服器,所有的Session資料將會遺失。
StateServer:儲存在 ASP.NET 狀態服務的處理序中;可以確保 Session 在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
SQLServer :儲存在SQL Server資料庫中;這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
Customer:自訂 Session State Provider,存放 Session 的資料;必須使用 sessionState 組態
前言
HTTP是沒有狀態(Stateless)的通訊協定,ASP.NET 提供數種狀態管理機制,分為用戶端與伺服器端兩種,用戶端包含 View state 、Control state、Hidden fields、Cookies 、Query strings 五種;伺服器端則有 Application state、Session state、Profile Properties 三種,之前小弟的文章有介紹過 ASP.NET 狀態管理 - ViewState ,今天則要介紹網頁中重要且很常用的 Session,若文章中有錯誤的地方,也請各位不吝指教!
Session係蝦米?
Web是沒有狀態的(重要觀念,小弟查閱的每篇文章都有提到!),剛剛有提到過,由於HTTP是沒有狀態的通訊協定,這表示Web伺服器會將網頁的每個HTTP要求視為獨立要求。ASP.NET Session是儲存於伺服器端(Server-Base)的狀態管理機制,預設會儲存在Server的記憶體中,Session 可以支援任何類型的物件來儲存及自訂Session名稱。Web Server 在儲存Session資料時,每一個用戶端的Session 資料是會獨立儲存的,如下圖所示
Session ID
Session ID 是用來瀏覽器與伺服器溝通用的,會放在 Cookie 或是 URL 中,以純文字方式在伺服器和瀏覽器之間傳送;當建立 Session 時,ASP.NET 透過獨特的演算法(unique 120-bit identifier)隨機產生一組對應的 Session ID,這個數字是獨一無二的,隨機的用意是為了防止惡意用戶不能透過解密的方式取的用戶的資料。
這裡用 ExploringSession 文章中其中講解整個流程的關係
explorSession
  • 使用者透過網頁提出儲存Session資料需求
  • 伺服器產生識別用的的Session ID給使用者瀏覽器使用(存放在Cookie中),並將Session資料儲存在 Session State Provider 中
  • 使用者瀏覽器將Session ID資訊傳送給Server,提出修改Session 資料內容。
  • ASP.NET 會透過 SessionID 在 Session Providers 尋找相對應的 Session 物件,找到後從狀態伺服器(State Server)中取得序列化的數據和類型轉換為物件,最後在傳給需求的網頁。
使用方式
使用上與 ViewState 很像,可以透過 HttpSessionState 類別(System.Web.SessionState) 取得內建的Session 物件儲存/或讀取,用法如下
string

// Set
Session["test"] = lblTest.Text;

// get
if (Session["test"] != null)
{
    lblTest.Text = "Hello" + Session["test"];
}
else
{
    // do something 
}
DataSet

//set DataSet
Session["DataSet"] = myDataSet;

//get DataSet
if (Session["DataSet"] != null)
{
    DataSet myDs = (DataSet)Session["DataSet"];
}
else
{
    // do something 
}
Session 狀態模式
下圖簡單介紹 Session 狀態的結構
SessionStateArchitecture
Session 狀態支援數種不同的資料儲存選項,簡單描述 Session 可用的狀態模式
  • InProc
    存在Web伺服器的記憶體中;ASP.NET中預設的Session狀態設定,是最常用也是最方便的 Session 狀態模式,缺點是如果重新啟動伺服器,所有的Session資料將會遺失。
  • StateServer
    儲存在 ASP.NET 狀態服務的處理序中;可以確保 Session 在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
  • SQLServer 
    儲存在SQL Server資料庫中;這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
  • Customer 
    自訂 Session State Provider,存放 Session 的資料;必須使用 sessionState 組態項目的providers 子項目,指定工作階段狀態存放區提供者的類型。
  • Off 
    停用Session
當需要選擇不同存取模式時,可在Web.Config檔案中設定 sessionState 項目的mode 屬性,







詳細 Session 狀態模式可以參考 工作階段狀態模式 from MSDN
設定狀態
可以透過Web.Config檔案中組態區段 sessionState 來設定 Session 狀態
sessionState 常用的項目為
  • Mode:指定儲存資料模式,請參考前一段內容。
  • Timeout:設定逾時週期時間,預設為20分鐘(以分鐘為單位)。
  • EnableSessionState:指定 @ Page 指示詞中 Session為啟用、停用或是唯獨。
  • Cookieless:設定 Session ID 是否內嵌於 URL 或儲存於 HTTP Cookie
  • StateConnectionString:用戶端與伺服器之間傳送的方式 
補充&參考
此篇文章是上網查詢自己整理的結果,如果內容有錯誤的地方,麻煩各位高手給予小弟指導
如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,謝謝 :D

2018年10月25日 星期四

[.NET] ASP.NET 特殊資料夾 [Special Folders]

在Visual Studio 2008 建立新的Web網站時,會同時新增一個特別的資料夾叫做「App_Data」,此資料夾是預留給資料庫使用,如Sql Server 2005 Express版,副檔名為「.mdf」的檔案。ASP.NET中有一些特殊的資料夾名稱,可以在專案點右鍵 > 加入 > 加入ASP.NET資料夾;將特殊資料夾加到專案中

ASP.NET Special Folders

    在Visual Studio 2008 建立新的Web網站時,會同時新增一個特別的資料夾叫做「App_Data」,此資料夾是預留給資料庫使用,如Sql Server 2005 Express版,副檔名為「.mdf」的檔案。ASP.NET中有一些特殊的資料夾名稱,可以在專案點右鍵 > 加入 > 加入ASP.NET資料夾;將特殊資料夾加到專案中,下表為ASP.NET特殊資料夾名稱及說明
SepcialFolders
  • App_Browsers
     包含瀏覽器定義檔案(
    .broweser),ASP.NET用來識別各瀏覽器及確定瀏覽器的功能。
  • App_Code
     應用程式(Application)動態編譯的類別文件(.cs、.vb檔案)。在此資料夾建立的類別不需要在頁面(Page)加入參考就可以使用。
  • App_Data
     此應用程式所使用的資料庫,如Microsoft Access、Microsoft SQL Server Express、XML 文件(.mdf c或.xml檔案)。
  • App_GlobalResources
     全域資源檔( .resx 或 .resources檔案)。應用程式的全局(Global)資源,任何頁面或是代碼都可以讀取及使用此資源文件,資源指的是跟程式內容相關不可執行的檔案,典型的資源有圖片位置、多國語言…等等。如支援多語系或是設計時不用重新編譯去修改Source Code。
  • App_LocalResources
     本機資源檔(只應用於ASP.NET Page的物件)。可以存於應用程式的文件夾中,跟GlobalResources不一樣,本機資源檔是跟特定的網頁相關連,ex:如果在LocalResources資料夾中有Default.aspx的網頁,就可以建立以下文件: 
    Default.aspx.resx:預設本地資源檔,當沒有符合的語言檔時,就以此為主。 
    Default.aspx.cn.resx :中文簡體的資源文件 
    Default.aspx.tw.resx:中文繁體的資源文件

     
  • App_Themes
     定義特定主題,用來定義網頁的外觀及控件使用(主題包括.skin、.css、image檔案)
  • App_WebReferences
     Web參考的檔案,如.wsdl、xsd、disco、discomap..等檔案類型,應用程式中有使用Web服務有關的檔案或文件。
  • Bin 
     編譯(Compilered)後的.dll檔案,或是Web應用程式程式碼中參考的dll檔。.dll檔案只要出現在Bin資料夾中,ASP.NET就能辨識它。
參考
此篇文章是上網查詢自己整理的結果,如果內容有錯誤的地方,麻煩各位高手給予小弟指導
如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,謝謝 :D

2018年10月22日 星期一

[CheatSheets] ASP.NET Format Strings

廢話
在之前自己有整理過 [筆記] string.Format 格式整理,最近在蒐集小抄表時發現原來早有神人整理過類似的資訊

.NET Format Strings 整理為下列幾項
  1. DateTime : Standard, Custom DateTime Format Strings
  2. Number Standard, Custom DateTime Format Strings
  3. Numeric : Custom Numeric Format Strings Output Examples 
在每項內容均有詳細說明,說明用甚麼樣的format string分別的value & output
相信對開發上會更有幫助 :D






2018年10月20日 星期六

[C#] 如何建立XML CDATA元素

摘要:C#如何建立XML CDATA元素
在與其他產品或服務Web services做溝通時,常常都會使用XML做資料交換的格式
最近遇到一個很特殊的案例,對方希望在傳過去的XML內容包兩層,第二層外面Tag要加上<![CDATA[" XML內容 "]]>
XML文字內容只要被<![CDATA[和]]>包在裡面的,XML解析器在解析時就不會去解析裡面的內容,這樣的文字稱為Character Data Section,簡稱CData Section。
以下是範例是說明如何使用C#  建立 CDATA Section
使用 XMLDocument

string myXml =
@"

 
 
";

XmlDocument doc1 = new XmlDocument();

doc1.LoadXml(myXml);

XmlNode target = doc1.SelectSingleNode("WorkingSet/Data");

if (target != null)
target.AppendChild(doc1.CreateCDataSection("
Hello
"));
使用 XDocument

 XDocument doc = XDocument.Parse(myXml, LoadOptions.SetLineInfo);

XElement dataNode = doc.Descendants("Data").First();

dataNode.Add(new XCData("

Hello

Console.WriteLine(doc.ToString());
結果



 Hello]]>

參考資料
有問題請多多指教,謝謝!

2018年10月19日 星期五

[C#] Web API - HttpClient 入門

HttpClient 介紹
當在開發 Client 程式時,要取得呈現在畫面上的資料會與 API / Server 進行連線動作,在過去可以使用 WebClient 或者是 HttpWebRequest ,在 .NET Framework 4.5 開始微軟提供 HttpClient 類別給開發者使用命名空間為 Sysyem.Net.Http,它提供靈活且可擴充的 API 來訪問 HTTP 公開的物件,發送 Request 跟接收回傳的 Response 主要是透過 HttpRequestMessage HttpResponseMessage 這兩個類別,透過 Content 屬性取得 HTTP 回傳內容與訊息;工作原理可以參考下圖
HttpClient 與 WebClient 和 HttpWebRequest 相比,有以下幾點值得注意的地方

1. HttpClient 實現允許默認標題 (default headers) 被設置並應用於所有請求,取消未完成請求
2. 可以透過單一 HttpClient instance 發送多個請求
3. HttpClient instance 不會與 Http Server 或是 Host綁定,也就是說可以使用相同 HttpClient 向 www.a.com 與 www.b.com 發送 request
4. HttpClient 使用新的工作式非同步模式 (TAP) 來處理非同步請求,處理與管理未完成請求變得較為容易

使用方式 
HttpClient 提供多個非同步方法取得 HTTP 內容,有 GET / POST / PUT / DELETE...等
以下為使用 HttpClient 進行 HTTP GET請求的範例程式 -> 這裡使用的是國家城市資訊的 geonames API

方式 1 - using GetAsync 

namespace HttpClientSample
{
    class Program
    {
 private const string uri = "http://api.geonames.org/search";

 static void Main(string[] args)
 {
  Run();

  Console.WriteLine("Hit enter to exit...");
  Console.ReadKey();
 }

 static async void Run()
 {
  using (HttpClient client = new HttpClient())
  {
   try
   {
                                client.Timeout = TimeSpan.FromSeconds(30);
    HttpResponseMessage response = await client.GetAsync(uri);
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();

    Console.WriteLine(responseBody);
   }
   catch (HttpRequestException e)
   {
    Console.WriteLine("\nException Caught!");
    Console.WriteLine("Message :{0} ", e.Message);
   }
  }    
 }
    }
}

程式說明 : 
  • Line 17 : 建立 HttpClient用 using包起來確保物件使用後資源可以被完整釋放掉
  • Line 21 : 設定 Timeout 屬性,避免資源浪費
  • Line 22 : 透過 HttpClient GetAysnc 方法發送非同步請求 HTTP Get Request 到目標 uri,並將目標uri Response 結果存放在 HttpResponseMessage 
  • Line 23 , 28 : EnsureSuccessStatusCode 如果 Status Code 不為 2xx,會丟出HttpRequestException,會進到 Catch 處理寫 error log message
  • Line 24 , 26 : 非同步的方式取得 HTTP Response 的 Content,並 print 出來
執行結果 : 
  • 使用非同步方法,會先輸出 print Hit enter to exit.
  • 紅色框框部分為 uri 回傳內容

方式 2 - using SendAsync 

static async Task RunSendAsync()
{
 using (HttpClient client = new HttpClient())
 {
  HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Get, uri);

  await client.SendAsync(httpRequest)
   .ContinueWith(responseTask =>
   {
    Console.WriteLine("Response: {0}", responseTask.Result);
   });
 }   
}
程式說明 : 
  • Line 5 : 建立 HttpRequestMessage instance並指定HTTP Method 為 GET 和呼叫的 Uri
  • Line 7 : 透過 SendAysnc 方法將 HttpRequestMessage 內容作為參數發送非同步請求
  • Line 8 : 任務完成後要做的事情,類似 Javascript 中使用 Promise 處理非同步的寫法
  • Line 10 : 將 HTTP Response 結果印出來
執行結果 : 

HttpClient v.s WebClient 
在蒐集資訊過程中看到 stackoverflow 有篇文章 在討論兩者的比較
小弟針對有回答得大大做個小整理,如果有遺漏或是誤解請各位大大告知
  • HttpClient 是新的 API,對於非同步處理是優於 WebClient 
  • HttpClient 比 WebClient 更接近 HTTP
  • HttpClient 沒有要取代 WebClient,像是 WebClient 就支援 FTP 而 HttpClient 不支持
  • HttpClient 適用於 .Net Framework 4.5以上非同步功能WebClient 使用上簡單和簡潔
  • RestSharp 結合 HttpWebRequest 簡單好使用 (列入研究清單 !!! )

參考
HttpClient 類別
Deciding between HttpClient and WebClient
WebClient vs HttpClient vs HttpWebRequest
HttpClient is Here
使用 HttpClient 來存取 GET,POST,PUT,DELETE,PATCH 網路資源
C# HttpClient WebAPI : 2. 最簡單的方式使用 HttpClient 類別
理解并使用.NET 4.5中的HttpClient

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com