我想我找到了原因。我创造了一个
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);
}
}