【问题标题】:Pass string as uri parameter containing slashes or is empty将字符串作为包含斜杠的 uri 参数传递或为空
【发布时间】:2013-01-20 11:19:40
【问题描述】:

我在使用 ASP.NET Web API 路由时遇到问题。具体来说,我想在 Uri 中传递一个空的或包含斜杠的字符串参数。但不幸的是,这会破坏路由。

我已经设置了正确的路由,如果我有一个普通的字符串,例如“fubar”,它匹配得很好。我试图传递编码的字符串 url,但这不起作用。显然问题是一些 http sys 层已经在解码字符串,这意味着不是"fu%2fbar" 到达,而是"fo/bar" - 这导致了另一条路线。

另外,当我传递一个空字符串时,uri 是 "api//...",这两个 / 被合并,段被丢弃。

解决/ 内部问题的一种方法是对 Uri 进行双重编码并在我的方法中对其进行解码。但这似乎是一个非常非常糟糕的选择,所以我正在寻找其他方法来解决这个问题。

【问题讨论】:

  • 将其设置为请求正文中接受的参数不是更有意义吗?
  • 当我有一个字符串作为资源的主要标识符时,这样做是没有意义的。正文中不应包含可选的过滤器查询字符串。

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


【解决方案1】:

对于斜线你可以准备特殊的路线

            "{controller}/{action}/{param1}/{param2}/{param3}"
            "{controller}/{action}/{param1}/{param2}"
            "{controller}/{action}/{param1}"


    public ActionResult Index(string param1, string param2, string param3)
    {
        string param = string.Concat(param1, param2, param3);

这样,fu 和 bar 是两个参数。

对于空字符串没有任何解决方案。我会在客户端应用程序中用空格字符或其他表示“空”但不是

的东西替换它

【讨论】:

  • 对不起,如果我让自己不清楚,但我想传递 一个 包含斜杠的字符串参数,而不是两个参数。您的建议对这种情况没有帮助。我不知道客户端究竟会发送什么字符串,所以我应该为无限数量的字符串保存方法吗?另外,如果他发送一个“?”,这也会破坏路由。
  • 当然。我只是建议你一个快速的解决方案。如果您需要管理所有 url 特殊字符,只需 url 编码,为什么它是一个不好的解决方案,它是为您的特殊问题而设计的。否则,编写自己的路由模块
  • 就像我说的,简单的 url 编码不起作用。它在路由之前被解码,所以编码是没有意义的。一个选项是在客户端中对我的字符串进行双重编码,然后在函数内再次对其进行解码,但这似乎是一种非常糟糕的方式。一定有更好的东西。
  • 我不明白为什么这是不好的方式。如果我们考虑传递“/”和“?”在 GET params 中是好方法,那么 url encoding 是很好的解决方案。但也许用那种命名资源调用rest url是你的问题
  • 但是 URL 编码不起作用。 url 将在路由发生之前被解码。这意味着只要 url 字符串参数包含“?”或“/”字符,无论字符串是否编码,路由都会中断。因此,显然我唯一的选择是对我的 url 进行双重编码并在我的方法中手动对其进行解码,或者阻止参数在我的客户端中包含这些字符(以及与之相关的所有内容)。这两种选择都不可接受,因此我希望并寻找更好的解决方案。
【解决方案2】:

我建议:

  1. 将请求类型更改为 POST 并将字符串放入请求正文中

  2. 或添加一个拦截器(DelegatingHandler),它将抓取请求并重写 url 中的参数,例如通过替换无效字符

【讨论】:

    猜你喜欢
    • 2016-11-20
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2017-10-16
    相关资源
    最近更新 更多