Azure Table Storage API 泛型設計

Azure Table Storage API 泛型設計

最近有機會使用到Azure Table Storage服務,Table Storage是早期Azure儲存體一種NoSQL儲存方式,程式開發上花點時間看看官網的文件,跟著範例做一下,大致上不會有太大問題。不過等真的要使用時會發現,如果按照範例程式的寫法,基本上是一整個寫死,沒有彈性可言。

建立Entity(實體)

Table Storage 的 SDK 設計是你在呼叫 Table API 之前必須傳入要儲存的 Entity(實體),如果讀者熟悉 Entity Framework 的話,可以想成 Entity Framework 的 Entity,如官網範例的 CustomerEntity

 public class CustomerEntity : TableEntity
 {
     public CustomerEntity(string lastName, string firstName)
     {
         this.PartitionKey = lastName;
         this.RowKey = firstName;
     }

     public CustomerEntity() { }
     public string Email { get; set; }
     public string PhoneNumber { get; set; }
 }  
 

然後進行CRUD操作時都是以 Entity 為單位,例如查詢:

 // Create a new customer entity.
 CustomerEntity customer1 = new CustomerEntity("Harp", "Walter");
 customer1.Email = "Walter@contoso.com";
 customer1.PhoneNumber = "425-555-0101";

 // Create the TableOperation object that inserts the customer entity.
 TableOperation insertOperation = TableOperation.Insert(customer1);

 // Execute the insert operation.
 table.Execute(insertOperation);  
 

在正式使用碰到的問題就是,我們通常針對這類操作的 API 會先抽離出來給大家共用,但問題是,此 Table Storage API 並不會事前知道你所要操作的 Entity 格式,Entity 格式應是留給使用端去定義,這樣才能發揮 NoSQL 的長處,如果一開始定義寫死了,那就和關連式資料庫沒有差別了。

Visual Studio裡偽前端開發神器Reload,讓你也擁有即開發即所見功能

Visual Studio裡偽前端開發神器Reload,讓你也擁有即開發即所見功能

好早以前,我介紹過在Sublime Text 3下的「前端開發神器 - Emmet LiveStyle 」,前端還有另一套有名的LiveReload都是很棒即開發即所見的開發方式。難到我們寫伺服器端的開發人員們,只能看著前端耍炫、耍酷、流著口水羨慕嗎?

.NET Framework 4.6新增Unix TimeStamp方法

.NET Framework 4.6新增Unix Time Stamp

skilltree課程

Timestamp(中文稱時戳、時間戳)是經常用於安全保護上的一種機制,例如每天上下班的打卡,就是一種保護勞資雙方的機制,卡打下去的那一刻的時間點是無法被偽造,用計算工時與工資。在網站資訊安全方面,例如近年流行的OAuth認證機制(facebook登入、google登入、github登入、Microsoft account登入…等第三方登入機制)中重要的Token,通常就會帶有Timestamp機制,以驗證Token的時效性。

Unix Time Stamp

TimeStamp很好,但他的格式並不好處理,我們看一下wiki上的範例:

  • Tue 01-01-2009 6:00
  • 2005-10-30 T 10:45 UTC
  • 2007-11-09 T 11:20 UTC
  • Sat Jul 23 02:16:57 2005
  • 12569537329
  • (1969-07-21 T 02:56 UTC) – first footstep on the Moon, "That's one small step for man, one giant leap for mankind"
  • 07:38, 11 December 2012 (UTC)

TimeStamp格式那麼多之外,在多國語系下,你可能還要自行先轉換為UTC (格林威治標準時間)時間。

在上述格式中,我們特別注意到一個12569537329數值,這是什麼東西?這種格式稱Unix Time,它是一種把時間轉換為數值的方式,它以1970-01-01 T 00:00 UTC為基準,每秒加 1 方式計算,如果是在基準點之前,就每秒 -1 方式計算。例如,我們把上述 Unix Time 放到http://www.unixtimestamp.com/進行轉換:

Timestamp Converter

就能還原成特定的時間點。因為數值的特性直覺、簡單、好處理,所以 Unix time 常被拿來做 Timestamp 使用。

升級舊專案中SQLLocalDb v11.0至v12.0

升級舊專案中SQLLocalDb v11.0至v12.0

Visual Studio SQL Server Express提示

舊專案裡保留著測試用的SqlLocalDb(*.mdf)檔案,在Visual Studio 2015開啟後會有一些提示,可以看到專案圖示明顯不同,也能看到提示訊息明確指出SqlLocalDb有版本上的差異。查了目前這台電腦,因為SSD空間有限,除了Visual Studio 2015之外,並無額外再安裝MS SQL Server (Express),查詢程式與功能確定Visual Studio 2015有安裝Microsoft SQL Server 2014 Express LocalDB。還要下載Microsoft SQL Server 2012 Express LocalDB?沒那麼笨吧!

程式與功能 - SQL Server 2014 Express LocalDB

試著點擊LocalDb(*.mdf),這次得到的線索很明確了。

Visual Studio LocalDb 連線錯誤

遷移專案MSBuild-Integrated Package Restore至Automatic Packages Restore

遷移MSBuild-Integrated Package Restore專案至Automatic Packages Restore

nuget參考錯

在前面VSO簽出packages少了dll怎麼辦?因為是採用NuGet Packages簽入VSTS版控(VSO改名為VSTS)碰到一些問題,還好平常都是看黑大的文章長大的,沒有花費許多時間就順利把問題排除。不過,最近在整理一個舊專案時,在不同電腦簽出之後實在很容易碰到NuGet套件的問題,有了第一次成功的經驗當然信心滿滿,立馬進行舊專案升級使用Automatic Packages Restore。結果就是上圖…

刪除NuGet組態

按照前文,我們進行了.nuget目錄的刪除,這樣會把下面三個MSBuild-Integrated Package Restore所使用的組態與.exe給刪除:

  • NuGet.Config
  • NuGet.exe
  • NuGet.targets

並把專案目錄下的packages目錄刪除。重新簽入(簽入後建議把本機版本刪除)與簽出(確認最新無.nuget與packages目錄版本)。其實到這裡都沒有錯,重新建置能看到 NuGet 有進行套件還原的動作,packages目錄也順利出現在專案目錄之下,建置就會如上圖一樣,一堆黃色三角型,一堆找不到參考元件的錯誤。

如何於MVC/Web API路由中傳送Base64編碼

如何於MVC/Web API路由中傳送Base64編碼

base64
from technet.microsoft.com

之前提到過如何使用路由傳遞含"+"符號到ASP.NET Web API 2有二種方式,一是使用QueryString,一是修改allowDoubleEscaping,不過allowDoubleEscaping的修改會降低系統安全性,是個不得以的選項。重覆的問題又活生生出現在面前,只是這一次必須把這個含+符號的值放在路由中。怎麼辦?有無更好的方式解決這個問題呢?

+號+號你為什麼會出現

首先,第一次處理如何使用路由傳遞含"+"符號到ASP.NET Web API 2問題時,那是一段對稱加密的程式,因為是中間接手處理,沒有細看實作細節,我們以DESCryptoServiceProvider (DES 的實作)為例來說明:

 private string Encryption(string plainText)                
 {                                                                      
     if (plainText == null || plainText.Length <= 0)                    
         throw new ArgumentNullException("cipherText");

     byte[] b = Encoding.UTF8.GetBytes(plainText);                      
     DESCryptoServiceProvider des = new DESCryptoServiceProvider();     
     ICryptoTransform ict = des.CreateEncryptor(des.Key, des.IV);               
     byte[] desData = ict.TransformFinalBlock(b, 0, b.Length);
                                                                        
     return Convert.ToBase64String(desData);                            
 }                                                                       
 
DES加密程式

看出問題點了嗎?

我們先看看這個的字串如果使用在路由上會產生什麼問題,以/{controller}/{action}/{id}路由為例:/home/index/EZ7+/+wvla4=,怎麼+號(加號)都還沒處理就馬上出事了?

看的出來了嗎?

有在寫MVC或Web API的人,第二個問題很直覺就能看出來了,多了一個「/」符號,此時就算設置allowDoubleEscaping讓路由能正常處理+號,id透過ModelBinding後還是不正常的。

回到問題一,看出問題了嗎?

設定VS2015 Update1中Go To Implementation快速鍵

設定VS2015 Update1中Go To Implementation加上快速鍵

如果各位在程式裡、專案間開始使用介面(Interface)來溝通,那是一個好的開始,習慣介面導向設計(interface-oriented design)或介面隔離原則(Interface Segmentation Principle, ISP)最大好處是斷開相依,一個介面能有多個實作,並且在需要時透過多型來執行對應的實作。但也有壞處是,壞處不是指介面本身,而是在 IDE 開發工具除錯介面不是那麼方便,Visual Studio 2013/2015多半會安裝第三方套件 Implementator(2013) 或 Go To Implementation 來解決這方面的需求。

設置Go To Implementation快速鍵

揭開HttpClient APIs在UWP的神秘面紗

揭開HttpClient APIs在UWP的神秘面紗

日前很高興有機會去參加SkillTree的UWP 與 Microsoft Azure 實戰課程(臺北場)課程,其中一個段落正是在介紹HttpClient APIs,我才知道目前的HttpClient在UWP有兩個實作:System.Net.Http.HttpClient 類別Windows.Web.Http.HttpClient 類別。它們兩個都應優先於WebClient和HttpWebRequest來使用。

這引起了我的好奇。看了一些文章與討論區,都沒有感到滿意的回答。最近剛好看到一篇官方 Blog 的文章,正是討論兩者的差異,覺得交代的很清楚,以下是我不負責簡單翻譯加筆記。

AutoMapper升級至4.1.1後出現ProfileName錯誤

AutoMapper升級至4.1.1後專案無法編譯

AutoMapper ProfileName Error

早上升級專案 AutoMapper 套件到最新版(4.1.1)後,發現專案無法通過編譯,查看錯誤訊息,看來是 AutoMapper 4.1.1 的屬性有些改變。

Profile.ProfileName

錯吳訊息

'xxx.ProfileName': cannot override inherited member 'Profile.ProfileName' because it is not marked virtual, abstract, or override

很明顯,新版本改變了 ProfileName 的存取方式,查詢AutoMapper Releases沒查到什麼有用的資訊。

按下F12查詢 Profile 類別的定義:

AutoMapper Profile 定義

ProfileName 屬性僅能 get,再看看建構式,解法很明顯了:

WebPack入門教學筆記

WebPack入門教學

what is webpack

Webpack與其他前端打包工具(watchify、Browserify)定位不太同,它是一個模組(module)系統,透過這些豐富的模組來實現更多的功能,它有:

  • 將CSS、圖片與其他資源打包至一個.js之中。
  • 打包之前預處理(less、coffeescript、jsx等)。
  • 依entry文件不同,把.js折分為多個.js
  • 豐富的模組元件

安裝webpack

參考 https://webpack.github.io/docs/tutorials/getting-started/

首先你必須安裝Node.js,我們需要使用npm進行套件的安裝與管理。

專案:npm install webpack --save-dev (儲存於專案目錄下)

全域:npm install webpack -g (global,存儲於本機之下)

使用Hangfire處理ASP.NET MVC/Web API長時間與排程工作

使用Hangfire處理ASP.NET MVC/Web API長時間與排程工作

工作管理

網頁通常是做為一個即時資訊交換工具,也就是一個請求-回應模式,不過在現實世界(或討論區)中經常會聽到希望可以進行長時間作業與排程作業的需求,網頁長時間作業通常是使用非同步技術來處理,但排程作業呢?這在單純的網頁作業流程中比較難處理,通常會說交給後端SQL Server排程處理或使用Windows工作排程器或寫成Windows Service來解決。

廢話那麼多,反正就是傳統網頁要處理長時間工作與排程工作都要額外花費不少心思,最近剛好有這方面的需求,試玩國外火紅Hangfire,不試還好,試了…

Hangfire - 射後不理、延遲、定時

Hangfire重點功能

Hangfire官網可以看到最明顯的三個功能:Fire-and-forget tasks、Delayed tasks、Recurring tasks。

如何為Visual Studio加上未支援的JavaScript框架InstelliSense功能,以React為例

如何為Visual Studio加上未支援JavaScript框架InstelliSense功能,以React為例

via GIPHY

從Visual Studio 2013開始,ASP.NET開發團隊就把前端技術的支援的優先順序大大調高,CSS、JavaScript編輯器在Visual Studio 2015功能更是不斷完善。然而,前端技術不斷大爆發的情況下,新框架總是比開發工具走的還快。以筆者最近接觸React為例,像TypeScript直到1.6(2015/9/17)才支援React的撰寫與編譯(*.tsx的撰寫在Visual Studio裡還是會有紅底線出現,但編譯與產生的React .js是正常的)。

但如果我不會寫TypeScript呢?是否能在撰寫js/jsx時也能提供有限語法提示(IntelliSense)呢?答案是可以的。

你為什麼不問問神奇海螺呢?

一開始提到VS2013是有原因的,在VS2013提供一個神奇JavaScript海螺,它提供一個很神奇的功能,如果你使用了一個Visual Studio還不正式支援的JavaScript框架(以下用React為例),那透過它的幫忙,你的Visual Studio就能取得有限React語法提示功能。

移除Windows桌面Intel與NVIDIA桌面內容選單

移除Windows桌面Intel與NVIDIA桌面內容選單

desktop menu

請問FB大神:有人知道怎麼修改桌面左鍵的選單項目,我想移除一些不用的選單。

討人厭Intel與NVIDIA桌面選單

如上圖,Git GUI Here與Git Bash Here選單是在安裝Git時沒選好給設定進去的。而Intel與NVIDIA的桌面選單是安裝好Windows 10作業系統後自己在那裡了。Intel與NVIDIA的那兩個桌面選單非常討厭,明明從來都沒使用過它,但就是佔著茅坑不拉屎!佔在那裡,從它本身的工具中也沒有任何地方可以設定關閉。

還好這個時代,除了G大神外(我不知道怎麼下這個情況的關鍵字),還是一位Fb大神。這一次感謝小白幫忙提供的解決辦法,解決了我長久以來的苦疾 XD

Surface pro 3升級Windows 10之後無法進行Miracast無線投影

Surface pro 3升級Windows 10之後無法進行Miracast無線投影

Surface+DP+Miracast

Surface pro 3有個很棒的功能,那就是支援Miracast無線投影,你只要買個無線投影接收器(我是買Actiontec ScreenBeam Mini 2,微軟自己有也出Microsoft 無線顯示轉接器硬體。)那麼你就能把外接器的螢幕(不論一般電腦螢幕或TV)當成你的第二螢幕或第三螢幕。像上圖是「Surface pro 3 + DP輸出 + Miracast輸出三螢幕輸出時的情況。

Windows 8.1升級Windows 10

家裡Lenovo T530與Surface pro 3都支援Miracast無線投影,並且在Windows 8/8.1時期都運作良好,但由Windows 8.1升級至Windows 10後都出現無法進行無線投影的情況。

...

我原本一度以為是Actiontec ScreenBeam Mini 2設備的問題,因為是連上官方網站時的那個訊息。我實在搞不清楚是Windows 10還是無線投影接收器的問題。這裡很感謝Aska幫忙找了許多方法,最後有些到一篇官方的55.3.5.0升級說明,一句「Feature: Added support for Windows 10」以為有解,高興之餘又有新問題。

新問題就是,這支Actiontec ScreenBeam Mini 2只能透過Wifi方式更新,但我身邊沒並沒有任何一台電腦現在看得到或找的到它

VSO簽出packages少了dll怎麼辦?

VSO簽出packages少了dll怎麼辦?

高美館-阿魯巴
from:https://www.flickr.com/photos/yellowmo/4754749137/

同事回報,簽出的專案無法編譯,查看之下發現,原來是新加入套件呈現黃色三角型狀態,直接點擊法(在黃色三角型套件點兩下)無效。刪除重新安裝法(Nuget移除重裝),被版本控管擋下,一堆@#$%^的訊息之後給出的關鍵號碼是「tf40024」,經G大神查詢後,連G大神說都它無能為力。又追到同事的Packags目錄之下,發現該套件目錄之下只有*.nupkg檔,正常是會含lib目錄,lib目錄下會含有此套件應有版本的DLL。

吼,這是誰簽入的啦,抓出去阿魯巴。

工作區找不到項目…或是您沒有存取權限

罪人小弟我,快回到本機查看。

由於套件是由我的電腦安裝與簽入,所以並不會產生專案無法編譯的情況。由於我想重新簽入含lib目錄與DLL檔的專案,我透過VS2015的Nuget進行了一次降級的動作。但不如人意,在Team Explorer裡看不到降級後的lib內容dll檔案!!!

我知道7月的鬼門開了,但VSO在雲端,應該天上管理,鬼魅們應該還無能力去上天做怪才是。

就在苦無辦法之際,看到一線訊息:

使用Sublime Text 3製作可攜式React開發環境

使用Sublime Text 3製作可攜式React開發環境

facebook logo

在閱讀facebook React學教手冊時,希望能動手寫個「Hello World!」,這才發現,我們被Visual Studio保護的太好,根本不知道火星(前端)是個什麼樣的世界,目前VS2015對React的支援還很有限,只好把Sublime Text請出來。但公司、家裡每一台電腦都需要重新設置一次又很麻煩,想到了Sublime Text的portable version,不用還好,一用就愛上了它的方便性。

Sublime Text 3 portable version

之前和同事聊天才學到,原來Sublime Text本身的portable version是個很棒的設計。portable想成「綠色軟體」,即不用安裝下載即用。然後在這個下載的portable版本裡,你可以依照不同的工作模式去製作各種的開發環境,例如,JavaScript開發環境、CSS開發環境、PHP開發環境、AngularJS開發環境、C#開發環境…等,並且互相不干擾。

這樣,可以讓每一個portable保有小又快的特性(不太會有越來趣肥越慢的問題,因為每一portable只針對一個某個開發環境來製作),並且帶到那用到那,換電腦也不必重新設定,非常方便。

React開發環境

以下Sublime Text 3的portable version並設定React的開發環境。

破解System.Web.Helpers 2.0.0.0與3.0.0.0之謎

破解System.Web.Helpers 2.0.0.0與3.0.0.0之謎

Error 2

System.Web.Helpers命名空間是.NET Framework裡一個神秘的組織,它和ASP.NET MVC 3一起推出,知道和用它的人並不多,它暗地裡提供許多便利型的功能(可以參考之前寫的系列文(12345678)。但如上圖所見,它在我VS2015裡的新專案裡就這樣赤裸裸的爆開,開啟著另一個VS2013的專案,怎麼一切安然無事。當下會很直覺的想罵聲-暗,是不是命中帶ㄕㄞˋ,老是碰到這種鬼錯誤。但有幾次VS2015的經驗,我改變心態,耐著性子一路追下去,意外發現System.Web.Helper一件不為人知的故事。

VS2015的IISExpress 10的applicationhost.config置叨位

VS2015的IISExpress 10.0的applicationhost.config置叨位

appcmd list site

代誌是這樣的,比較認識我的人就會知道,我在開發Web Application (MVC、Web API)除非需要下中斷點除錯,不然其實我是比較少按【F5、Ctrl+F5或含瀏覽器名稱的綠色三角型】來啟動IISExpress.exe,那要怎麼啟動呢?我喜歡用指令的方式來啟用IISExpress。VS2015新增新網站應用程式專案後發現,怎麼在apcmd list site怎麼樣就是找不到剛新增的專案?但VS2015又能正確啟動新增好的專案呢!

初探Visual Studio 2015 IntelliTest

初探Visual Studio 2015 IntelliTest

from internet source

大家都以為寫測試「很恐怖」,那麼今天就為各位介紹Visual Studio 2015新加入的功能【IntelliTest】,讓各位開發人員可以在很快樂的氣氛中完成程式碼的測試。

使用VS2015建立單元測試專案

使用VS2015建立單元測試專案

from Internet source

如果要在Visual Studio 2013裡的既有專案中去建立單元測試專案,大多會選擇由微軟開發的Unit Test Generator擴充套件。不過情況在Visual Studio 2015有些不一樣,VS2015不只內建快速建立單元測試專案的方式並且提供的是一個擴充性更強的建立方式。

C槽沒空間裝Visual Studio 2015怎麼辦?EaseUS Partition Master Free來幫你

C槽沒空間裝Visual Studio 2015怎麼辦?EaseUS Partition Master Free來幫你

disk

話說,Visual Studio 2015於7/20上市,當然第一時間很想衝下去,但就在要衝下去之前發現一個問題,我們一般的筆電預設都會切C:與D:,廠商預設C:與D:的分割是還好,不過對於開發人員就不是一件好事,Windows 8.1、Office 2013、Visual Stuio 2013、MS SQL Server 2014光這基本的四套,C:空間就去了3分之2吧。

C槽空間不足怎麼辦?

可能的方向有三:

我的爛Code重構之路(二)-泛型方法

我的爛Code重構之路(二)-泛型方法

Stinky tofu

前篇提到,以功能分解開發的缺點,但功能分解的開發方式也有其優點,那就是程式碼壞味道(Code Bad Smell)特別的重,就像是吃臭豆腐,味道難然不佳,但如果好好認真盡快的處理,變成一道美味的佳餚也並無可能。

壞味道-發現相似的邏輯

在撰寫函數式Class時,你應該有個直覺,那就是很容易發現相似的邏輯

舉個簡單的例子,我想整合使用臺北市政府資料開發平台上的資料:

如何使用路由傳遞含"+"符號到Web API 2

Web API 2如何使用路由傳遞"+"符號

我們需要傳遞一個加密過的參數,此加密方法產生有一定機會產出含"+"符號的亂數。"+"符號在網路傳遞過程中會有一些問題,常見的解決辦法是傳遞前後使用Encode與Decode方法來針對特殊符號進行加解密。但在Web API 2比較難處理。

Web API 2與"+"號的邂逅

在預設的Web API 2範本及預設的路由"api/{controller}/{id}"設置下,簡單進行兩個測試:

測試一

以QueryString方式"/api/values?id=1%2b1"進行請求。這裡的%2b是"+"符號Encode的代表號。這個測試可以順利到達Get(string id)方法之內。

我的爛Code重構之路

在《軟體構築美學 pdf p.16 》提到軟體開發中鐵三角的概念。

而作者則提出另一個水平的觀點:

軟體開發的天平
天平左邊放的是(預估的)時程和資源,代表我們希望盡量減少的部分。
天平右邊放的是品質和功能,我們希望這部分愈多愈好。
重點在於天平必須隨時保持平衡,如果要增加一項功能,就必須增加適量的時間和資源來維持平衡。
如果經費不足,你就得做出選擇:要犧牲品質還是功能。

在Azure Web Apps發行時進行進行程式碼異動比較

在Azure Web Apps發行時進行進行程式碼異動比較

使用版本控管(Version Control)(不論使用git、TFS、Visual Studio Online等管理系統)之後,異動的比較(Code Compare)是一個非常實用的功能,重點在於能即時與伺服器端版本控管進行程式碼比較,這絕對不是本機式比較軟體(如:http://winmerge.org/)所能比的上的。

今天無意中發現一個發行Azure Web Apps(之前稱Azure Websites)時好用的比較小技巧。可以在進行Azure的發行動作中進行比較的動作,等於是可以進行最後的確認動作。

需求:web.config的組態切換

我的需求是這樣,我的web.config針對Debug與Release有不同的組態設置,最常見的需求就是connectionString,Debug組態連接LoadDB或測試資料庫,Release組態切換至正式資料庫。原本的測試方式很笨,就是切換Debug或Release模式,然後執行網站,看看讀取對應的組態內容是否正確。

發行網頁 - 預覽

在Azure Web Apps提供發行與發行的差異預覽,之前都一直誤以為這只是個檔案更新清單

Azure web apps Publish Preview

今天突然好奇的去點擊了我那由Debug切換至Release的web.config組態檔,結果:

Azure web apps publish code compare

跑出了預覽變更視窗。這個技巧能用在所有文字類型的檔案上,例如:.cshtml / .js / .css。目前使用在像 Web.config 或重點更新的檔案幫了不小的忙,好幾次都是直接在預覽變更就發現問題,而省下不必要的浪費。例如上圖,從比較的結果就能知道組態檔的值已經替換成功,這一點反而是方案總管中的原始檔比較無法做到的

Dino的指點,這個程式碼比對更精確的說是「Web Deploy」所提供的功能,是個發怖前程式碼比對功能。

解決.svg無法在Azure websites載入顯示的問題

解決.svg無法在Azure websites載入顯示的問題

SVG稱可縮放的向量圖形,它本身有兩種格式,一種是XML格式,簡單想,它就如同一般HTML tag一樣,在網頁的中它使用<svg></svg>標籤。

SVG的XML格式

以下是使用wiki上的範例程式碼,你只要使用<svg></svg>標籤,就能在網頁上畫面你想要的任何向量圖。

  <!DOCTYPE html>
  <html lang="en">
  <head>
   <meta charset="UTF-8">
   <title>Document</title>
  </head>
  <body>
   <svg xmlns="http://www.w3.org/2000/svg" version="1.1" 
      width="467" height="462">
     <!-- This is the red square: -->
     <rect x="80" y="60" width="250" height="250" rx="20" fill="red"
           stroke="black" stroke-width="2px" />
     <!-- This is the blue square: -->
     <rect x="140" y="120" width="250" height="250" rx="40" fill="blue"
           stroke="black" stroke-width="2px" fill-opacity="0.7" />
  </svg>
  </body>
  </html>  
 

ASP.NET Web API 文件產生器(2) - Swagger

ASP.NET Web API 文件產生器(2) - Swagger

前一篇,我們使用ASP.NET Web API範本內建的Help Page快速產出即時的Web API文件,不過在APP Service - API App我們可以發現,微軟在未來的API App範本使用另一個Swagger,接下來我們來看看如何在現有的ASP.NET Web API專案中導入使用Swagger。

在ASP.NET Web API整合Swagger

Swagger是100% Open Source的軟體,它不只能快速產生Web API文件(有好看的UI),而且能直接透過JSON或YAML進行Web API的匯入與匯出,並且可以快速的對你的Web API進行測試,不論此Web API是在本機或是遠端。

  • Swagger UI 你可以試著操作Swagger的界面。
  • Swagger Editor 可以使用JSON或YAML進行Web API的定義描敘,你可以隨意修改看看即時效果。

ASP.NET Web API 文件產生器(1) - Help Page

ASP.NET Web API 文件產生器(1) - Help Page

開發ASP.NET Web API有個很重要的問題,就是文件的撰寫,但開發者都知道,我們希望把心力放在ASP.NET Web API應用程式上面而非文件,原因很簡單:改變是容易的。但如何即時反應程式上的修改,這就不是一件容易工作。

Help Page

在Visual Studio 2013,如果一開始就選擇Web API專案,那麼從專案一開始你就會擁有一個強大的Web API文件產生器,Web API文件產生器由Yao - MSFT針對ASP.NET Web API所設計。

Help Page - Areas目錄

啟動Web API範本會發現比MVC範本一個【API】的連結。

API連結

進入後可以看到Yao設計的ApiExplorer會動態解析目前專案下繼承ApiController的Controller的API方法。

API清單

點擊任一API方法,可以看到更進一步的訊息。

API詳細資訊

如果讀者有跟著做或玩過Help Page會覺得這也太陽春了吧!對,這是因為我們還沒有提供足夠的資訊給ApiExplorer。

安裝Windows 7/8出現0x800300024錯誤

速記 - 安裝Windows 7/8出現0x800300024錯誤

最近重新安裝Windows 8,結果過程非常不順利,一直卡在安裝系統前的磁碟分割那一段,會出現一個0x800300024的錯誤。

解決辦法很簡單:暫時移除要安裝系統磁之外所有HDD/SSD。也就是讓磁碟分割那裡剩一顆硬碟。

標題會有Windows 7是因為,Google的時候,好像一堆Windows 7也有此問題。

此篇到此,真速記也。

Microsoft Azure APP Service - API APP 服務概觀

Microsoft Azure APP Service - API APP 服務概觀

有四個部分:

  • 如何開發 API APP - Swagger
  • 如果發行 API APP 至 Microsoft Azure
  • API Client - 快速開發的法寶
  • 如何進行遠端 API APP 偵錯
  • 轉移 Web API 為 API APP - API SDK 使用

Microsoft Azure專案發行時無法預覽

Microsoft Azure專案發行時無法預覽

最近某個Microsoft Azure專案一直有個問題,問題是在「發行」時無法進行預覽,如果按下預覽鈕,那麼會出現錯誤。

錯誤訊息

由於例外狀況 '嘗試對條件 "'$(TargetPlatformVersion)' > '8.0'" 中評估為 "" (而非數字) 的 "$(TargetPlatformVersion)" 進行數字比較。 C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets' 而導致叫用組建失敗。

一但產生錯誤,Microsoft Azure專案就會無法發行,必須關閉重開,然後不能在發行時按下「預覽」鍵,就能順利發行。利用錯誤訊息求助G神,得到「找不到符合搜尋字詞」的結果,有點苦腦。

閃開,讓專業的來

還好,小弟還認識一位Microsoft Azure的朱神,經過小朱的幫助,給出一個通靈級的解答:$(TargetPlatformVersion)’ > ‘X.X’ Error

看起來是Resharper 8.x的bug。而我電腦中的Resharper是由8升級至9的沒錯。

ReSharper Repair

將ReSharper進行Repair,問題解決,收工。

ELMAH 整合 HipChat API v2

ELMAH 整合 HipChat API v2

古人說:「前人種樹,後人乘涼。」可以的話,我們應該再加點肥料來「回饋」。在無痛整合 Demo HipChat 時,在最後一篇眼尖看到他使用的是v1版本,目前最新的是version 2版本,順手花了點時間測試與升級ELMAH的設置改為使用HipChat API version 2版本。

ASP.NET MVC 5如何正確加入robots.txt?

ASP.NET MVC 5如何正確加入robots.txt?

robots.txt

圖片: http://blogtimenow.com

各位都知道ASP.NET MVC Framework從一開始就是走「路由(Routing)」機制,它並不是使用如ASP.NET (WebForms)的實體路徑+實體檔案的對應方式,所以要如何做才能加入robots.txt?

習慣性之Google之路

對於不知道的事物,我相信大家的第一選擇就是求Google大神幫忙。

關鍵字:mvc robots.txt

哇,有一堆的答案,都已經ASP.NET MVC 5了,這問題應該早就已經是FAQ級的問題了吧?

處理方式有二:

  • "robots.txt" Routing + ViewResult
  • "robots.txt" Routing + FileResult

"robots.txt" Routing 意指設置一條 url: "robots.txt",然後利用 default: 指到預設的 {controller}/{action},由此來回應 robots.txt 的內容。

ViewResult 是利用 View Page 來回應 robots.txt 內容。File 是利用資料流來回應 robots.txt 的內容。以效率而言,File沒有 Disk I/O 成本,是比較好的的方式,所以我最後選用File來回應 robots.txt 的內容。

以上透過一條假路由方式來模擬根目錄下的 robots.txt。

網路上的教學都還會特別提到一條 web.config 的設置:<modules runAllManagedModulesForAllRequests="true"></modules>,由 iis.net 文件中可以看到以下說明:

Optional Boolean value.

True if all managed modules can process all requests, even if the request was not for managed content; otherwise, false.

Note: In ASP.NET websites, the value of runAllManagedModulesForAllRequests previously had to be set to true to support routing. However, once IIS 7 has been updated with a Service Pack, the value of runAllManagedModulesForAllRequests can be set to false or omitted when working with ASP.NET routing. For more information, see ASP.NET Routing on the MSDN website.

The default value is false.

也就是說從 IIS 7 開始(更正確是指某個 Service Pack,我沒細查,文件也沒寫),為了支援 ASP.NET Routing ,runAllManagedModulesForAllRequests 預設會修改為 false,如果 web.cofing 沒有加上去,那麼你會得到一個 HTTP 404 錯誤。但這樣好嗎?

OzCode - 最強大的 Visual Studio 偵錯套件

OzCode - 最強大的 Visual Studio 偵錯套件

我們都知道Visual Studio是地表最強的開發工具,其中與開發人員最相關的二個功能是開發時的IntelliSense與除錯用的IntelliTrace,IntelliTrace雖然強大好用,但是要Ultimate版才有完善支援,當然,那是一筆不小的費用。那麼除了升級為Ultimate版本外,是否還有其他好的選擇?是的,OzCode就是一套筆者要介紹給各位的Visual Studio Debug擴充程式。

OzCode

好的除錯工具帶你上天堂。OzCode是一套可以解決除錯上煩腦的強大套件。

OzCode正在舉辦一個除錯測試,參加者有機會贏得一套OzCode授權,以下範例以除錯測試中的範例來示範,讓各位讀者看看使用OzCode的前後差異。

OzCode Challenge

第一題

void Main()
{
 bool flag = true;
 StringBuilder sb = new StringBuilder();
 sb.Append("foo " + flag == false + " Bar");
 Console.WriteLine (sb.ToString());
}   
  
OzCode 第一題

LINQPad執行結果是false,但是why?

我們看看在Visual Studio下使用IntelliTrace的結果:

IntelliTrace-1
IntelliTrace-2

雖然對於變數內容的變化,我們可以很容易的透過區域變數視窗來觀察,但對於運算式的運算過程IntelliTrace就比較幫不上忙。我們還是只知道結果是false,但為何是false還是有看沒有懂。

第二題

void Main()
{
 var riddle = new Riddle();
 ((Counter)riddle.counter).Increment();
 Console.WriteLine (((Counter)riddle.counter).Count);
}

// Define other methods and classes here
struct Counter
{
 private int x;
 public void Increment() { this.x++; }
 public int Count { get { return this.x; } }
}

class Riddle
{
 public readonly object counter = new Counter();
}   
  
OzCode 第二題
IntelliTrace-3

執行結果為0,但為什麼為是0呢?

第三題

void Main()
{
 bool boolean1 = true;
 bool boolean2 = true;
 bool boolean3 = false;
 
 if (boolean1 = boolean2 && boolean3)
  Console.WriteLine ("true");
 else
  Console.WriteLine ("false");
}   
  
OzCode 第三題

執行結果為false