C# 将字符串作为包含斜杠的uri参数传递或为空

C# 将字符串作为包含斜杠的uri参数传递或为空,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我在ASP.NET Web API路由方面遇到问题。具体来说,我想传递一个字符串参数,该参数要么为空,要么在Uri中包含斜杠。但不幸的是,这打破了路线 我已经设置了一个正确的路由,如果我有一个普通的字符串,比如“fubar”,这是很好的匹配。我试图传递url编码的字符串,但这不起作用。显然,问题是一些http系统层已经在解码字符串,这意味着不是“fu%2fbar”到达,而是“fo/bar”——这会导致另一条路由 另外,当我传递一个空字符串时,uri是“api/…”,两个/被合并,段被丢弃 解决内

我在ASP.NET Web API路由方面遇到问题。具体来说,我想传递一个字符串参数,该参数要么为空,要么在Uri中包含斜杠。但不幸的是,这打破了路线

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

另外,当我传递一个空字符串时,uri是
“api/…”
,两个
/
被合并,段被丢弃


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

对于斜杠,您可以准备特殊的路线

            "{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);
这样,福和巴是两个参数

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

的内容。我建议:

  • 将请求类型更改为POST,并将字符串放入请求主体中

  • 或者添加一个拦截器(DelegatingHandler),该拦截器将捕获请求并重写url中的参数,例如通过替换无效字符


  • 抱歉,如果我弄不清楚,我想传递一个包含斜杠的字符串参数,而不是两个参数。你的建议对这个案子毫无帮助。我不知道客户端到底会发送什么字符串,所以我应该为无限量的字符串保留方法吗?还有,如果他发送一个“?”,这也会破坏路由。当然。我只是建议你一个快速的解决方案。如果您需要管理所有url特殊字符,只需url编码,为什么这是一个糟糕的解决方案,它是为您的特殊问题。否则,编写自己的路由模块就像我说的,简单的url编码不起作用。在进行路由之前,它会被解码,因此编码是毫无意义的。一个选项是在客户端对我的字符串进行双重编码,然后在函数中再次解码,但这似乎是一种非常糟糕的方法。一定有更好的办法。我不明白为什么这样不好。如果我们考虑在获取参数中传递“//”和“?”是个好方法,那么URL编码是很好的解决方案。但也许用这种命名资源调用RESTURL是您的问题,但url编码不起作用。url将在路由发生之前解码。这意味着每当url字符串参数包含“?”或“/”字符时,无论字符串是否编码,路由都将中断。显然,我唯一的选择是在我的方法中对我的url进行双重编码并手动解码,或者防止参数在我的客户机中包含这些字符(以及与之相关的所有内容)。这两个选项都是不可接受的,因此我希望并寻找一个更好的解决方案。将其设置为请求正文中接受的参数是否更有意义?当我有一个字符串作为资源的主标识符时,这样做没有意义。正文中不应包含可选的筛选器查询字符串。