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

C# Web Api action method automatically decoding query parameter

我在具有参数的控制器中有一个 C# Web Api 端点。此参数接受加密字符串,此字符串将包含“/”、“&”、“+”等字符。因此,每当我从 javascript 调用我的 Api 端点时,我都会使用 [=] 对其进行编码12=] 函数。因为我期待编码字符串,所以我在 Web Api 代码中使用了 HttpUtility.UrlDecode,以便在我的应用程序中解码和使用它。

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

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

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

我有两个惊喜。首先,为什么参数自己被解码,其次,为什么“+”字符被解码为空白 space?在我理解发生了什么之前我不能使用这段代码,因为以后可能会有意外(也许自动解码停止)这不会很好。

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

要解决问题,只需删除 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 "thinks" 每个 get 参数都被编码和解码的原因。

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

要补充上面的答案,解码+字符到space的问题是编码解码的工作原理。 space 被编码为 +,因此会将其解码为 space.

当我们进行 google 搜索时,您可以看到以下内容。如果您在 google 搜索框中键入任何带有 spaces 的字符串并单击搜索,选中 URL,它将有一个查询参数 "q",其中包含搜索条件.这些将被编码,条款中的 spaces 将被转换为 +