如何於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,存儲於本機之下)