C#Web Api操作方法自动解码查询参数

nak*_*nak 3 c# url encoding decoding asp.net-web-api

我在具有参数的控制器中具有C#Web Api端点。此参数接受加密的字符串,并且此字符串将包含“ /”,“&”,“ +”等字符。因此,每当我从javascript调用Api端点时,都会使用encodeURIComponent函数对其进行编码。由于我期望HttpUtility.UrlDecode在Web Api代码中使用编码字符串,以便在我的应用程序中对其进行解码和使用。

public HttpActionResult MyAction(string encodedString)
{
    string decodedString = HttpUtility.UrlDecode(encodedString);
    // Process request
}
Run Code Online (Sandbox Code Playgroud)

为了检查代码是否按预期工作,我通过发送编码字符串作为输入开始调试。令我惊讶的是,我发现输入参数已经自行解码并通过action方法传递了。这可以与我使用的解码器方法配合使用,但是在出现“ +”字符时开始中断。当我传递带有“ +”字符的字符串时,解码器方法将其更改为空格。

例如传递djdh67-y&+dsdj给解码器更改为djdh67-y& dsdj

我有两个惊喜。首先,为什么参数本身被解码,其次,为什么“ +”字符被解码为空白?在我了解发生了什么之前,我无法使用此代码,因为稍后可能会出现意外情况(也许自动解码停止),这将是不好的。

有人可以向我解释到底发生了什么或解决此问题的最佳方法是什么?

ASp*_*rin 6

要解决问题,只需要摆脱掉这一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
Run Code Online (Sandbox Code Playgroud)

GET浏览器可能会错误解释其中未编码的值。例如&,请求字符串中的符号表示下一个参数。这就是为什么MVC“认为”每个get参数都经过编码和解码的原因。

如果在不变状态下需要字符串,则应在POST请求正文中传递它。

  • 我知道去掉解码方法就能解决问题。我想知道编码的字符串是如何自动解码的。是因为 asp.net Web Api 的某些内部功能吗?我们可以使用配置来控制它吗?它每次都能 100% 解码字符串吗? (2认同)