Rest 如何使Webapi GET方法使用查询参数上的保留字符?
我有一个非常简单的webservice,它有一个GET方法,该方法有一个令牌字符串参数。我使用这个令牌可以有字母“+”和“/”。例如:mC1SW7RJhgsQGtRHhsg/Q+FGoZjbBleNKtpqT7zLMtE 我使用这个令牌在数据库中查找是否有这个令牌的数据 我在控制器中的方法如下: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),
[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", "/");