【发布时间】:2020-01-23 19:12:56
【问题描述】:
我有一个非常简单的 web 服务,它带有一个带有令牌字符串参数的 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));
}
}
我看到 Dapper/Webapi 自动转义了这个参数,例如将“/”更改为“%2F”。
当我部署它时,它只适用于没有特殊字符的令牌并返回 404。
作为一种解决方法,我更改了服务器中的令牌以对令牌进行编码并将编码的加号替换为空格:
string decodedToken = WebUtility.UrlDecode(token);
token = decodedToken.Replace(" ", "+");
问题是我需要我的客户做相反的事情并替换“+”号:
var encodedToken = WebUtility.UrlEncode(token);
// Convert '+' to ' '
token = encodedToken.Replace("%2B", " ");
在不要求客户替换 de '+' 符号的情况下,推荐的工作方式是什么?
【问题讨论】:
-
如果您控制他们收到的令牌,您可以在将令牌交付给他们时对其进行编码? stackoverflow.com/questions/26353710/…
标签: rest asp.net-core iis asp.net-core-webapi