我正在使用带有GET方法的WebApiController开发一个应用程序,如下所示:
public class MyController : ApiController
{
[HttpGet]
[Route("groupIdType/{groupIdType}/groupId/{groupId}")]
public async Task<IHttpActionResult> GetGroup(
[FromUri] string groupIdType,
[FromUri] string groupId)
{
// do stuff...
}
}
问题是groupId
完全可能有URL保留字符。事实上,对于目前唯一支持的groupIdType
,groupId
总是有/
个字符(我希望我可以更改此字符,但这是一个超出要求的要求我的控制)。
我在类似的问题中看到了this question,因为我正在写一个关于如何在网址参数中传递保留字符的问题,这建议将/
字符编码为网址中的%2F
。我已经尝试过这样:
https://MyServiceBaseUrl/groupIdType/someType/groupId/blah%2Fblah%2Fblah
但这给了我一个404 Not Found。此外,当我尝试这个时:
https://MyServiceBaseUrl/groupIdType/someType/groupId/blah%2F
并检查了调试器中groupId
的值,然后groupId
的值为blah
,而不是blah%2F
或blah/
,正如我所料。这让我觉得编码的斜杠正在被读取,好像它们没有被编码一样。
通过对上述相同问题的评论,我有了使用此路线的想法:
[Route("groupIdType/{groupIdType}/groupId/{*groupId}")]
现在,我可以发送与上面第一个相同的网址,在调试器中,我看到groupId
的值为blah/blah/blah
- ,请注意这是不是< / strong>编码。如果我使用此请求传递未编码的ID,我会得到相同的结果:
https://MyServiceBaseUrl/groupIdType/someType/groupId/blah/blah/blah
这实际上没问题,因为项目中的一些其他开发人员表达了对编码/解码id的担忧,而宁愿能够像这样传递它。但我也想了解这里发生了什么。为什么请求不通过编码参数?此外,路线中的*
字符有什么作用?在我链接的问题中没有解释,我在搜索中找不到任何关于它的内容。