2017-09-16 45 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”,它将包含搜索条件。这些将被编码和条款中的空格将被转换为+