Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 如何使Webapi GET方法使用查询参数上的保留字符?_Rest_Asp.net Core_Iis_Asp.net Core Webapi - Fatal编程技术网

Rest 如何使Webapi GET方法使用查询参数上的保留字符?

Rest 如何使Webapi GET方法使用查询参数上的保留字符?,rest,asp.net-core,iis,asp.net-core-webapi,Rest,Asp.net Core,Iis,Asp.net Core Webapi,我有一个非常简单的webservice,它有一个GET方法,该方法有一个令牌字符串参数。我使用这个令牌可以有字母“+”和“/”。例如:mC1SW7RJhgsQGtRHhsg/Q+FGoZjbBleNKtpqT7zLMtE 我使用这个令牌在数据库中查找是否有这个令牌的数据 我在控制器中的方法如下: [HttpGet("{token}")] [ProducesResponseType(typeof(string), 200)] [ProducesResponseType(typeof(void),

我有一个非常简单的webservice,它有一个GET方法,该方法有一个令牌字符串参数。我使用这个令牌可以有字母“+”和“/”。例如:mC1SW7RJhgsQGtRHhsg/Q+FGoZjbBleNKtpqT7zLMtE

我使用这个令牌在数据库中查找是否有这个令牌的数据

我在控制器中的方法如下:

[HttpGet("{token}")]
[ProducesResponseType(typeof(string), 200)]
[ProducesResponseType(typeof(void), 404)]
public JsonResult Get(string token)
{
    string sql = "SELECT dataObject FROM Session WHERE id = @SessionToken";
    var data = _conn.QueryFirstOrDefault<Session>(sql, new {SessionToken = token});
    if (data == null){
        var r = Json(string.Empty);
        r.StatusCode = StatusCodes.Status404NotFound;
        return r;
    }
    else {
        return Json(JsonConvert.DeserializeObject(data.dataObject));
    }
}
问题是我需要我的客户做相反的操作,并替换“+”号:

var encodedToken = WebUtility.UrlEncode(token);
// Convert '+' to ' '
token = encodedToken.Replace("%2B", " ");

在不要求客户更换de'+'符号的情况下,推荐的工作方式是什么?

尝试在
web.config
中添加以下代码:

<system.webServer>
   <security>
      <requestFiltering allowDoubleEscaping="true" />
   </security>
</system.webServer>


由于某些原因,请参阅

,Kestrel或.NET MVC在编码的URL中执行部分解码。这看起来像一个BUG(),但有一个解决方法

使用您传递的有问题的令牌,您将在客户端对其进行编码:

 Original Token: mC1SW7RJhgsQGtRHhsg/Q+FGoZjbBleNKtpqT7zLMtE   
 Encoded Token: mC1SW7RJhgsQGtRHhsg%2FQ%2BFGoZjbBleNKtpqT7zLMtE
看到“/”变成了“%2F”,而“+”变成了“%2B”。这是因为这两个字符是URL组成的一部分。因此,要将它们完全传递给WebApi,必须将它们替换为ASCII表示形式

您将使用编码令牌调用您的服务,如下所示:

 http://myserver:1234/myservice/token/mC1SW7RJhgsQGtRHhsg%2FQ%2BFGoZjbBleNKtpqT7zLMtE
在您的服务中,由于该错误,您将从Kestrel/MVC收到以下部分解码的字符串:

 Partially decoded token: mC1SW7RJhgsQGtRHhsg%2FQ+FGoZjbBleNKtpqT7zLMtE
只需实现一个简单的替换:

 token.Replace("%2F", "/");

您的字符串将被完全解码。

它是dotnetcore。这不适用。@StaticX此链接用于asp.net core发布到IIS,您尝试过吗?如果您控制他们接收的令牌,您可以在第一时间将令牌传递给他们时对其进行编码?
 token.Replace("%2F", "/");