路线

时间:2016-03-30 18:39:39

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

我有一个.NET Web API v2,需要定义一条路径,该路由可以在路径中的任何位置包含正斜杠。我在WebApiConfig中配置了(像这样):

config.Routes.MapHttpRoute(
    name: "SomeRouteName",
    routeTemplate: "api/summary/{*token}",
    defaults: new { controller = "Summary" });

不幸的是,令牌包含斜杠,此时我无能为力。如果斜杠不在令牌的开头,则上述路由在大多数情况下有效。因此,照顾大多数情况。但是如果令牌以斜杠开头,则它不起作用,因为第一个斜杠被解释为我假设并被吃掉的URL的一部分。所以在我的控制器操作中,我有以下代码(当然是我试图避免的黑客攻击):

if (summary == null)
{
    summary = _repo.GetSummary($"/{token}");
}

显然,这只适用于单个斜杠。我可以做一个循环并添加更多,但没有办法知道它可能有多少。目前我的数据库中没有令牌以两个斜杠开头,所以这个错误的代码现在有效。它被用作创可贴,直到找到更好的解决方案。

编辑:这引用了*路线,它主要解决了我的原始问题,但仍与第一个斜线不匹配:URLs with slash in parameter?

1 个答案:

答案 0 :(得分:1)

由于OP在一些评论中说:

  

没有目的 - 但是生成了令牌而不是生成令牌   必须由我的代码。所以我无法控制令牌   代。

还有:

  

我尝试过UrlEncode / Decode以查看是否有效,但是   斜线(编码为%2F)仍然因任何原因被吃掉。作为一方   请注意,我可以说Base64编码它会解决这个问题,但我不能   此时更改此信息,因为它会破坏现有的API   应用

我想说避免特殊字符问题的最佳选择之一是首先将整个令牌编码为基本64字符串,然后对其进行url-encode以编码可能的字符,如=

也就是说,您可以配置不需要{token*}但只需{token}的路线。如果您需要简化令牌解码,您可以实现一个ActionFilterAttribute来解码引擎盖下的所谓绑定参数。

其他人已经这样做了......

OAuth2已经发送基本身份验证的凭据,将其编码为base64字符串(将user:password转换为整个base 64字符串)。

这是解决这些问题的常用方法,可以在每个现代客户端和服务器平台中解码64个字符串。