只有累積,沒有奇蹟

2018年11月13日 星期二

[typescript] 如何得知 Visual Studio 使用 Typescript 的版本?

前言
近期工作都在使用 Typescript 進行開發,要如何得知目前Typescript 版本呢? 

取得目前版本方法
Visual Studio 2017 
  1. 專案按右鍵 > Properties > TypeScript Build Tab > TypeScript Version
    此專案就是使用 2.3 version,如果要修改的話就選要用的版本即可

    注意 : 異動編譯版本有可能部分方法會不支援造成編譯失敗
  2. 暴力修改方式也可以直接到 projectName.csproj 裡面修改 <TypeScriptToolsVersion> 的值,譬如想換成 2.5 版儲存後即設定完成
  3. Developer Command Prompt tool :
    在windows search input  > Developer Command Prompt tool for 2017 > 在console write : tsc -v可取得目前版本

 
Visual Studio 2013

  1. Help > About Microsoft Visual Studio 
  2. Installed products 會顯示目前使用Typescript 版本號

Typescript Compiler Path


Typescript Compiler (tsc.exe) 在安裝時預設位置為 :
C:\Program Files (x86)\Microsoft SDKs\TypeScript
從下圖可以得知,在我電腦目前有1.0, 2.2, 2.3 以及 2.5四種版本

2018年11月10日 星期六

[typescript] 如何在 Visual Studio 2017 安裝 TypeScript 1.8 Compiler ?


前言
最近公司在進行升級 Visual Studio 2017 IDE,有些專案在過去開發時是使用舊的 TypeScript 版本,這篇文章是在記錄如何在 Visual Studio 2017安裝 TypeScript 1.8版 Compiler (預設不會裝) 的過程

釐清案情
專案從版控下載後發現Build不過
,發現錯誤訊息如下圖





錯誤訊息疑似是版本不支援關係
,這時需要查看此專案檔用 TypeScript用到的版本號為 1.8 (專案右鍵 > Properties > TypeScript Build Tab > TypeScript Version),怪異的是版號旁邊出現之前 unavailable 



從上一篇文章可以知道
,Typescript Compiler 安裝時預設位置在 Microsoft SDKs\TypeScript 目錄底下,因此進此目錄確認發現此目錄並沒有 1.8 版本的資料夾 








解決過程
  1. 使用 Nuget Package Manager Console 輸入指令安裝 TypeScript 1.8 版本:  
    PM > Install-Package Microsoft.TypeScript.Compiler -Version 1.8.11
    重新 Build 之後發現依然無法成功建置成功,GG斯米達
  2. 請教Google大神發現 TypeScript 1.8 在 Visual Studio 2013 有安裝檔,點擊 下載 連結後進行安裝
  3. 安裝完後在 Build 發現建置正常,Microsoft SDKs\TypeScript 目錄底下也有 1.8 版本的資料夾,打完收工 !!

[C#] Anonymous Type 匿名型別

說明
Anonymous Type 是甚麼?
匿名型別是C# 3.0開始有的特性,是一種暫存型的型別,不需要建立額外的類別來存放資料
根據MSDN對於 匿名型別 的說明如下








根據MSDN的說明
,整理一下重點及特性
1. 透過 new 建立實體 
// Anonymous Typevar employee = new { Id = 1, Name = "Marcus", Age = 22 } ;
要使用時,透過 匿名物件初始設定(anonymous object initializer) 來建立實體,不需要先定義employee物件的prop或是屬性
2. 不需要事先明確定義屬性型別





型別名稱會由編譯器產生,我們可以透過物件的object.GetType()方法來取得物件的型別名稱
以上述的例子,將滑鼠移到var上會發現產生的型別名稱為 f__Anonymous0'3

3. 唯讀屬性 






公開且唯讀的屬性(Immutable types)
,屬性設定初始值後,無法再修改

4. 屬性類型由編譯器推斷






有
在建立匿名型別物件時,其屬性類型會由編譯器自動推斷
以上述的例子,employee.Name與Age在建立時並未定義屬性類型
建立後滑鼠移上去即可發現類型已經自動指定為初始值屬性值類型
Name => String , Age => int嗎

使用場景

匿名型別帶來很多方便的地方,有時需要一個簡單的類別來儲存一些簡單的資料,但又不想為了簡單的需求另外定義一個類別(沒其他地方用到),這時就可以使用C#的匿名型別,或是有資料來源是兩個不同物件或類別,現在需要取得個別的其中一個屬性來做回傳,這時也可以使用匿名型別來產生新的載體,ex 使用LINQ使用進行JOIN後最後Select new 某某屬性,減少貧血類別的數量

參考

Huan-Lin 學習筆記: C# 筆記:匿名型別


2018年11月9日 星期五

2018年11月7日 星期三

[IIS] HTTP 錯誤 500.21 - Internal Server Error

前言

換新筆電後在安裝公司專案過程遇到很多問題,昨天是SQL Server服務異常關閉,今天是專案出現問題是"HTTP 錯誤500.21 - Internal Server Error",但這樣也不錯,可以學到更多新知識與問題,這裡簡單紀錄一下處理過程

錯誤訊息 HTTP 錯誤 500.21

HTTP Status Code 狀態碼 是Server端 Response 的狀態,在 Status Code Definitions 文件中可以看到詳細的說明,在IIS 7.5之後 HTTP 狀態碼可以簡單分為下列幾種

  • 1xx - 資訊
  • 2xx - 成功
  • 3xx - 重新導向
  • 4xx - 用戶端錯誤
  • 5xx - 伺服器錯誤
從Server回傳給瀏覽器的錯誤代碼來看,是屬於伺服器錯誤
其中還有提示可能發生的原因與解決方法,主要錯誤訊息為 : 

處理常式 "ExtensionlessUrlHandler-Integrated-4.0" 的模組清單中有錯誤的模組 "ManagedPipelineHandler"
關鍵字提到可能是 
模組錯誤 與 ASP.NET安裝不完全,在看HTTP Status Code 500.21 是 無法識別模組,因此下一步便是比對桌機正常的專案環境與筆電的IIS設定站台的模組設定(Handler Mapping)差異

發現兩台模組設定大不相同,主要是缺少ASP.NET 4.0 相關模組
解決方式打開命令提示字元cmd,執行下列指令

dism /online /enable-feature /featurename:IIS-ASPNET45 /all
會跳出安裝畫面如下圖,安裝進度100%後即完成


確認
  1. 重新reload畫面及正常執行
  2. 可以去IIS站台Handler Mapping發現已新增ISAPI 4.0相關模組

參考
IIS 7.0、IIS 7.5 及 IIS 8.0 的 HTTP 狀態碼
aspnet-regiis-exe-ir-does-not-work-on-windows-8

2018年11月5日 星期一

[VS2017] 如何在Visual Studio中設定C#建置版本

發生情境

前陣子同事從版控取完最新的source Build在Build時跳出錯誤,錯誤訊息如下
Feature 'nameof operator' is not available in C# 5. Please use language version 6 or greater.
錯誤訊息中很明確的說明在 code 所使用的 nameof function 
僅支援 C# 6以上的版本,但修改的同事並未發生此問題,因此立即解決發生提出問題的人請發生問題的同事去查看Visual Studio 建置是用哪一版的 C#,發現這功能並不是大家都知道,在此簡單記錄一下遇到這問題時該如何處理

使用方式 

在Visual Studio 2013之後,可以在專案設定所需要建置的 C# 版本為何,使用方式如下
1. Project按下右鍵,選擇Properties
2. 點選 Build > Advance

3. 在Advance Build Settings 中有個選項Language version : 可以選擇需要使用 C# 哪個版本進行建置


舉例來說,在過去大家很習慣用String.Format來進行字串的連接,在 C# 6.0之後可以改使用 $ (interpolated strings)進行字串相加,但如果你的Visual Studio 版本設定建置的 C# 版本低於6.0在建置時就會跳出錯誤,如下圖示


Visual Studio中預設是會使用最新的 C# 版本來build
如果沒特殊需求不用調整
,或是依所需情境設定完再調回來即可 :D

參考

How to change language version in Visual Studio 2015

2018年11月2日 星期五

[VS2017] The current .NET SDK does not support targeting .NET Core 2.1

發生情境

最近在開發時遇到取完最新的source code Build時發生錯誤,Visual Studio error message 如下

The current .NET SDK does not support targeting .NET Core 2.1.  Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.



此專案一開始是使用.Net Framework進行開發的,為何一天後自動變成.Net Core版本
(這是甚麼神奇的黑魔法?),後來與同事確認後發現為了要在跨平台進行測試,所以升級為.Net Core版本
此錯誤訊息中很明確的提到目前電腦中的版本過舊不支援 .NET Core 2.1,重新安裝所需的版本即可

安裝 .NET Core 2.1 SDK  

1. 到微軟官方網站下載頁面 : https://www.microsoft.com/net/download
2. 於.NET Core 2.1區域選擇 x86 下載
3. 下載完後點擊 dotnet-sdk-2.1.402-win-x86.exe 執行檔



4. 按下一步到底
,會在電腦內安裝.NET Core 2.1 runtime & SDK 


4. 重 Build 後就 Success,打完收工 !  

參考

www.microsoft.com/net/download

2018年11月1日 星期四

[.NET] ASP.NET Application 概述

ASP.NET 處理請求的兩個步驟
當用戶發送一個請求到IIS(這裡指IIS 5.0 & IIS 6.0),ASP.NET 處理請求的步驟有兩種
1. 建立一個可以處理用戶端傳來請求Request的環境(ASP.NET Environment),包括建立application object(應用程式)、Ruquest、Response、Context Object等物件來處理此Ruquest請求。
2. 環境被建立後,應用程式會透過modules、handlers、page objects等事件模組來處理此Ruquest請求。
前言    
    當你在網址列輸入 www.google.com.tw 後並按下Enter時,瀏覽器會送出一個Request請求到Web Server端,瀏覽器是透過HTTP(HyperText Transfer Protocol)通訊協定與Web Server伺服器做溝通。當你輸入網址後,從Client端發送一個Request到伺服器,當伺服器處於活動狀態和要求內容伺服器認定是有效的話,伺服器會接收並處理此Request,伺服器處理完畢會發送Response 回Client的瀏覽器,瀏覽器在將回傳的結果呈現在網頁上,
關係如下圖
ASP.NET 處理請求的兩個步驟
    當用戶發送一個請求到IIS(這裡指IIS 5.0 & IIS 6.0),ASP.NET 處理請求的步驟有兩種
  1. 建立一個可以處理用戶端傳來請求Request的環境(ASP.NET Environment),包括建立application object(應用程式)、Ruquest、Response、Context Object等物件來處理此Ruquest請求。
  2. 環境被建立後,應用程式會透過modules、handlers、page objects等事件模組來處理此Ruquest請求。
一、ASP.NET Environment
  1. 使用者發送一個請求Request到IIS,當Web 伺服器收到請求時,會檢查請求檔案的副檔名、判斷應該處理請求的ISAPI 擴充程式(ISAPI extension),然後將請求傳遞至適當的ISAPI 擴充程式來處理對應到的副檔名。例如:當請求的網頁為「.aspx」時,就會透過「aspnet_isapi.dll」來處理。
  2. 如果是第一次發送請求到網站時(當ASP.NET接收應用程式中任何資源的第一個要求時),名為 ApplicationManager 的類別會建立應用程式定義域(Application Domain)。
  3. 應用程式定義域(Application Domain)會建立 HostingEnvironment 物件後,接下來ASP.NET 會建立和初始化核心物件,例如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 類別包含目前應用程式要求的特定物件,例如 HttpRequest 和 HttpResponse 物件。HttpRequest 物件包含目前要求的資訊,包括Cookie 和瀏覽器資訊。HttpResponse 物件包含傳送至用戶端的回應,包括所有呈現的輸出和Cookie。
  4. 一旦ASP.NET核心元件被建立後,會藉由建立 HttpApplication 類別的執行個體來啟動應用程式。 如果應用程式有定義Global.asax 檔的化,ASP.NET 會改為建立衍生自 HttpApplication 類別的Global.asax 類別執行個體,然後使用衍生的類別代表應用程式。
  5. HttpApplication物件會指派給要求ASP.NET 核心物件來處理網頁。
  6. HttpApplication接著透過HTTP module events、handlers、page events來處理此請求。

關係請參考下圖


更多細節請參考:點我點我
二、使用MHPM處理Resuest
    當HttpApplication被建立後,HttpApplication就開始準備處理client傳來的請求(Request),在處理的過程中會經歷下列三個模組「HttpModule」、「Page」、「HttpHandler」,分別會觸發不同的事件,開發人員可以依據需求將程式邏輯加入到至事件中,首先先來瞭解「HttpModule」、「HttpHandler」,它們協助開發人員可以在執行ASP.NET網頁開始及結束時,加入客製化的邏輯程式處理來協助開發,兩者主要的差異在於
HttpHandler:如果要加入新的文件類型(副檔名)判斷時,可以在<httpHandlers>設定檔中使用add的方式,將收到的要求對應到適當地處理類別中。

舉例來說
  1. 要新增判斷副檔名是 .New 之檔案的所有 HTTP 要求,都對應至類別 MyHandler.New
  2. 將具有副檔名 .MyNewFileExtension 之檔案的 HTTP GET 和 HEAD 要求,都對應至類別 MyHandler.MNFEHandler
<add path="*.New" type="MyHandler.New,MyHandler" verb="*">
    <add path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll" verb="GET,HEAD">
</add></add>
    


Ps : 兩個類別都位於 MyHandler 組件,此組件則是在 MyHandler.dll 檔案中。
更多細節請參考:點我點我
HttpModule:如果要在ASP.NET pipleline(處理管線?)中自訂事件的話,可以透過加入httpModules來實現,例如 SessionStateModule 類別,換句話說,httpModules可以用來實做自訂的HTTP模組。


建立方式
  1. 建立一個實作IHttpModule 的類別。
  2. 並將模組的組件放到應用程式的\bin子目錄下。
  3. 將 <HttpModules> 項目加入至應用程式的 web.config。
<httpmodules>
    <add name="modulename" type="namespace. classname, assemblyname"></add></httpmodules>

    

更多細節請參考:點我點我
MHPM 接下來要處理請求Request的四個重要步驟MHPM(HttpModule、HttpHandler、ASP.NET Page、HttpModule)
Step 1(M: HttpModule):接受到用戶端的請求開始,ASP.NET引擎建立HttpModule之後,可以利用六個重要的事件來注入客製化的邏輯程式碼來協助開發,分別是BeginRequest,AuthenticateRequest,AuthorizeRequest,ResolveRequestCache,AcquireRequestState和PreRequestHandlerExecute。
Step 2(H: HttpHandler):一旦上述6個事件被觸發時,ASP.NET引擎將呼叫ProcessRequest事件。(當你的專案有建立HttpHandler時)。
Step 3(P: ASP.NET page):當執行完HttpHandler之後,ASP.NET Page物件就會被建立,當ASP.NET Page物件就會被建立之後, Page 事件也接著被觸發,這些Page事件可以提供開發者加入自訂頁面事件的邏輯在Page事件中,有6個重要的事件,分別是Init, Load, validate, event, render and unload。可以利用「SILVER」來記住Page的事件,S(Start)、I(Init)、L(Load)、V(Validation)、E(Event)、R(Render)、U(Unload)。
Step4(M: HttpModule):當Page物件被建立並執行完Page的事件之後,HttpModule提供四個處理的事件供開發者加入自訂邏輯,分別是PostRequestHandlerExecute、ReleaserequestState、UpdateRequestCache、EndRequest。


參考網址
沒想到因為一個小小的好奇,可以整理出這樣長篇大論的文章,內容都是從網路上各方高手文章取得
也順便釐清一下自己過去的一些疑問及錯誤觀念(錯誤觀念真多 XD),記錄下來方便日後做參考
如果內容有錯誤的地方,麻煩各位高手給予小弟指導,謝謝 ^^
ps :如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,感謝

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

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com