如何於MVC/Web API路由中傳送Base64編碼
之前提到過如何使用路由傳遞含"+"符號到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);
}
看出問題點了嗎?
我們先看看這個的字串如果使用在路由上會產生什麼問題,以/{controller}/{action}/{id}路由為例:/home/index/EZ7+/+wvla4=,怎麼+號(加號)都還沒處理就馬上出事了?
看的出來了嗎?
有在寫MVC或Web API的人,第二個問題很直覺就能看出來了,多了一個「/」符號,此時就算設置allowDoubleEscaping讓路由能正常處理+號,id透過ModelBinding後還是不正常的。
回到問題一,看出問題了嗎?
.jpg)



