gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:23:10 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

要解决这个问题,只需去掉 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 “认为”每个 get 参数都被编码和解码的原因。

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

关于C# Web Api action方法自动解码查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46255160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com