为什么我的网址参数没有被编码?

时间:2016-12-07 19:34:23

标签: c# asp.net-web-api

我正在使用带有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保留字符。事实上,对于目前唯一支持的groupIdTypegroupId 总是/个字符(我希望我可以更改此字符,但这是一个超出要求的要求我的控制)。

我在类似的问题中看到了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%2Fblah/,正如我所料。这让我觉得编码的斜杠正在被读取,好像它们没有被编码一样。

通过对上述相同问题的评论,我有了使用此路线的想法:

[Route("groupIdType/{groupIdType}/groupId/{*groupId}")]

现在,我可以发送与上面第一个相同的网址,在调试器中,我看到groupId的值为blah/blah/blah - ,请注意这是不是< / strong>编码。如果我使用此请求传递未编码的ID,我会得到相同的结果:

https://MyServiceBaseUrl/groupIdType/someType/groupId/blah/blah/blah

这实际上没问题,因为项目中的一些其他开发人员表达了对编码/解码id的担忧,而宁愿能够像这样传递它。但我也想了解这里发生了什么。为什么请求不通过编码参数?此外,路线中的*字符有什么作用?在我链接的问题中没有解释,我在搜索中找不到任何关于它的内容。

0 个答案:

没有答案