【问题标题】:C# Web Api action method automatically decoding query parameterC# Web Api 动作方法自动解码查询参数
【发布时间】:2018-02-25 13:35:24
【问题描述】:

我在具有参数的控制器中有一个 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

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

谁能解释一下到底发生了什么或者解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: c# url asp.net-web-api encoding decoding


    【解决方案1】:

    要解决这个问题,只需去掉 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 请求的正文中传递。

    【讨论】:

    • 我知道去掉解码方式就可以解决问题。我想知道编码的字符串是如何自动解码的。是因为 asp.net Web Api 的一些内部功能吗?我们可以使用配置来控制它吗?它会每次都 100% 解码字符串吗?
    • 我想使用GET 是不可能的。因为GET参数应该被编码以被浏览器正确处理。但在POST 请求的情况下,它不会自动编码/解码。将您的查询更改为 POST 并将数据放入 body 中,而不是解码。
    【解决方案2】:

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

    当我们进行谷歌搜索时,您可以看到以下内容。如果您在谷歌搜索框中键入任何带有空格的字符串并单击搜索,请检查 URL,它将有一个查询参数“q”,其中包含搜索词。这些将被编码,术语中的空格将被转换为 +

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 2012-12-30
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 2017-07-25
      • 2013-02-08
      相关资源
      最近更新 更多