【问题标题】:.NET Web API Slash in Route路由中的 .NET Web API 斜线
【发布时间】:2016-03-31 02:55:47
【问题描述】:

我有一个 .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?

【问题讨论】:

  • UrlEnconding/Decoding 这个令牌不可能吗?
  • 那么token开头有很多斜线的目的是什么?
  • @bruno-garcia 我尝试了 UrlEncode /Decode 以查看这是否有效,但无论出于何种原因,斜线(编码为 %2F)仍然会被吃掉。附带说明一下,我可以说 Base64 编码可以解决此问题,但我目前无法更改此问题,因为它会破坏现有应用程序的 API。
  • @Matias 没有任何目的——但令牌是由我的代码生成的,不一定是由我的代码生成的。所以我无法控制令牌的生成。

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


【解决方案1】:

由于 OP 在一些评论中说:

没有任何目的——但是令牌是生成的,而不是 一定是我的代码。所以我无法控制令牌 一代。

还有:

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

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

也就是说,你可以配置一个不需要{token*}而只需要{token}的路由。如果需要简化令牌解码,可以实现一个ActionFilterAttribute,在后台解码所谓的绑定参数。

其他人已经这样做了……

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

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

【讨论】:

  • 我同意 base 64 编码可以解决它,但我希望找到一个路由/配置解决方案,因为我无法更改它。我提出它应该是 base 64 编码的,但决定不这样做。我现在也不能让我的消费者更改他们的代码。
  • @BrandonRader 好吧,如果您/我们找到更好的解决方案,我会更新我的答案...目前,似乎没有比这更多的解决方法...
  • @BrandonRader 也许动作过滤器或自定义参数绑定可以解决问题...
  • @BrandonRader 另一种方法可能是将此令牌作为查询字符串参数而不是路径的一部分......顺便说一句,这也会迫使您的客户改变他们的代码....
  • @BrandonRader 我不确定,但也许您的问题可以使用 URL 重写来解决。例如,我不确定,但也许 IIS 或您当前正在使用的任何 Web 服务器可以使用令牌映射路径而不将其编码到令牌被重写为查询字符串参数的路由...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2013-01-16
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2017-11-05
相关资源
最近更新 更多