c# - 为什么我的查询字符串参数被 url 解码两次?
问题描述
我有一个使用 .Net 4.7.1 的 web api,我注意到在其中一个端点上执行 get 时出现了一些奇怪的行为。当我对端点执行获取http://localhost:52684/api/v1/some-resource?client_timezone=%2B0500
时,参数客户端时区被接收为" 0500"
而不是"+0500"
. 我唯一能想到的是 Url 被解码了两次,所以"%2B"
变成了"+"
然后" "
。有谁知道这种情况的任何常见原因或为什么会发生这种情况?
这是控制器上的类似端点
[HttpGet]
[Authorize]
[ApiRoute("some-resource", StartingVersion = 1)]
[EnableCors("*", "*", "GET", "*")]
public IHttpActionResult SomeResource([FromUri] string timezone)
{
if (!DataValidationUtililties.IsValidClientTimezone(timezone))
{
return BadRequest();
}
return Ok();
}
解决方案
我想我找到了原因。我创建了一个SnakeCaseActionSelector
本质上重写所有请求 URI 的方法。在这样做时,它会解码 url,并且永远不会再次对查询字符串参数进行编码。
public class SnakeCaseActionSelector : ApiControllerActionSelector
{
public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
{
var requestUri = controllerContext.Request.RequestUri;
var queryPairs = controllerContext.Request.GetQueryNameValuePairs().ToList();
if (!queryPairs.Any())
{
return base.SelectAction(controllerContext);
}
queryPairs = queryPairs.Select(x =>
new KeyValuePair<string, string>(CamelCaseToSnakeCaseConverter.FromSnakeCase(x.Key), x.Value))
.ToList();
var newQueryParams = queryPairs.Select(x => $"{x.Key}={x.Value}").Aggregate((x, y) => x + "&" + y);
var builder = new UriBuilder(requestUri)
{
Query = newQueryParams
};
controllerContext.Request.RequestUri = builder.Uri;
return base.SelectAction(controllerContext);
}
}
推荐阅读
- django - 为什么 widthratio(乘法)在我的模板中不起作用?
- javascript - 分配给变量的数组是“未定义的”
- javascript - 如何在 Angular 上为 ag-Grid 监听 sortChange(event)?
- kubernetes - 为什么入口忽略全局静态IP?
- c# - Visual Studio 项目构建为 dll 而不是可执行文件
- python-3.x - lxml.etree.SerialisationError:使用 cabby/libtaxii 时出现 IO_ENCODER 错误
- mongodb - 撇号-cms中的自动完成和文本搜索内存问题:需要想法
- sql - 对引用的项目使用 Open Query
- tensorflow - How to lower RAM consumption in Tensorflow?
- rest - 将标志添加到 UnityWebRequest