2017-09-16 108 views
1

我有一個C#Web Api終端控制器中有一個參數。這個參數接受一個加密的字符串,這個字符串將包含像「/」,「&」,「+」等字符。所以每當我從javascript調用我的Api端點時,我使用encodeURIComponent函數對它進行編碼。由於我期待的編碼字符串我在我的Web Api代碼中使用HttpUtility.UrlDecode,解碼並在我的應用程序中使用它。C#Web Api操作方法自動解碼查詢參數

public HttpActionResult MyAction(string encodedString) 
{ 
    string decodedString = HttpUtility.UrlDecode(encodedString); 
    // Process request 
} 

要檢查代碼是否按預期工作,我開始通過發送編碼字符串作爲輸入進行調試。令我驚訝的是,我發現輸入參數已經自行解碼並將其傳遞給action方法。這與我用過的解碼器方法很好地工作,但有一個「+」字符時開始打破。當我傳遞一個帶有「+」字符的字符串時,解碼器方法將其更改爲空格。

例如,通過djdh67-y&+dsdj解碼器更改爲djdh67-y& dsdj

對我來說有兩個驚喜。首先,爲什麼參數自己解碼?第二,爲什麼「+」字符被解碼爲空格?在我明白髮生了什麼之前,我不能使用這段代碼,因爲稍後可能會出現意外(可能是自動解碼停止),這將不太好。

有人可以解釋我到底發生了什麼,或者解決這個問題的最好方法是什麼?

回答

3

爲了解決問題只是擺脫HttpUtility.UrlDecode(encodedString)部分。

即將到達該操作的值已被解碼,並且您不需要第二次解碼

在您的例子:

encodeURIComponent("djdh67-y&+dsdj")  -> djdh67-y%26%2Bdsdj // sent 
HttpUtility.UrlDecode("djdh67-y%26%2Bdsdj") -> djdh67-y&+dsdj  // done 
HttpUtility.UrlDecode("djdh67-y&+dsdj")  -> djdh67-y& dsdj  // wrong 

GET不編碼值可以通過瀏覽器無法正確地解釋。例如請求字符串中的符號&表示下一個參數。這就是爲什麼MVC「認爲」每個獲取參數都被編碼並解碼的原因。

在未更改狀態下需要字符串的情況下,應將其傳遞給POST請求的主體。

+0

我知道刪除解碼方法將解決問題。我想知道編碼的字符串是如何自動解碼的。是否因爲asp.net Web Api的一些內部功能?我們可以使用配置控制它嗎?它會每次解碼字符串100%嗎? – nak

+0

我想這不可能使用'GET'。因爲'GET'參數應該被編碼以便被瀏覽器正確處理。但在POST請求的情況下,它不會自動編碼/解碼。把你的查詢改成'POST'並把數據放入** body **中,而不是解碼。 – ASpirin

0

爲了增加上面的答案,解碼+字符到空間的問題是編碼解碼是如何工作的。空間編碼爲+,因此將其解碼爲空間。

當我們進行谷歌搜索時,您可以看到以下實際情況。如果您在谷歌搜索框中輸入任何帶有空格的字符串並點擊搜索,請檢查網址,它將有一個查詢參數「q」,它將包含搜索條件。這些將被編碼和條款中的空格將被轉換爲+