在参数中使用斜杠的URL?

题:

我正在创build一个维基软件,基本上是维基百科/ mediawiki的克隆,但在ASP.NET MVC(MVC是重点,所以不build议我ScrewTurn)。

现在我有一个问题:

我使用这个路由映射来路由一个URL,如下所示:
http://en.wikipedia.org/wiki/ASP.NET

routes.MapRoute( "Wiki", // Routenname //"{controller}/{action}/{id}", // URL mit Parametern "wiki/{id}", // URL mit Parametern new { controller = "Wiki", action = "dbLookup", id = UrlParameter.Optional } // Parameterstandardwerte ); 

现在刚刚发生在我身上,可能会有像“AS / 400”这样的标题:
http://en.wikipedia.org/wiki/AS/400

另外还有一个(标题为“Slash”):
http://en.wikipedia.org/wiki//

和这个:
http://en.wikipedia.org/wiki//dev/null

总体而言,维基百科似乎有这样一个有趣的标题列表: http : //en.wikipedia.org/wiki/Wikipedia : Articles_with_slashes_in_title

我如何正确地使这条路线这样的路线?

编辑:
就像是:
如果URL以/ Wiki /开头,并且不以/ wiki / Edit /(但不是/ Wiki / Edit)开头,则将URL的所有其余部分作为ID传递。

编辑:
嗯,只是另一个问题:我怎样才能路由这一个:
http://en.wikipedia.org/wiki/C&A

维基百科可以…

编辑:
根据维基百科,由于与wikitext语法冲突,只有下列字符不能在页面标题中使用(DISPLAYTITLE也不支持):

 # < > [ ] | { } 

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_(technical_restrictions)#Forbidden_​​characters

编辑:
允许*和&,放

 <httpRuntime requestPathInvalidCharacters="" /> 

到文件web.config中的<system.web>部分

(在这里find: http : //www.christophercrooker.com/use-any-characters-you-want-in-your-urls-with-aspnet-4-and-iis )

你可以使用一个catchallpath来捕捉url后面的wiki部分的所有内容到id令牌中:

 routes.MapRoute( "Wiki", "wiki/{*id}", new { controller = "Wiki", action = "DbLookup", id = UrlParameter.Optional } ); 

现在,如果您有以下请求: /wiki/AS/400 ,它将映射到Wiki控制器上的以下操作:

 public ActionResult DbLookup(string id) { // id will equal AS/400 here ... } 

/wiki//而言,我相信在这个请求到达ASP.NETpipe道之前,你将会从Web服务器得到一个400错误的请求错误。 您可以结帐以下博客文章 。

@Darin:那很明显,问题是:为什么? 控制器+动作+ ID给出,就像它是通过所有这些路线再次… – – Quandary 11年6月13日在17:38

Quandry – 也许你已经知道了,因为你的问题已经过了一年多了,但是当你调用RedirectToAction时,实际上是向浏览器发送一个HTTP 302响应,这会导致浏览器对指定的操作发出GET请求。 因此,你看到的无限循环。

请参阅: Controller.RedirectToAction方法

在mvc中的Attribute Routing我有相同的问题有/在stringabc/cdeHttpGet

  [Route("verifytoken/{*token}")] [AllowAnonymous] [HttpGet] public ActionResult VerifyToken(string token) { //logic here } 

所以你必须放置*因为在这之后它将被视为参数

仍然作为一个选项在Global.asax文件中写入:

  var uri = Context.Request.Url.ToString(); if (UriHasRedundantSlashes(uri)) { var correctUri = RemoveRedundantSlashes(uri); Response.RedirectPermanent(correctUri); } } private string RemoveRedundantSlashes(string uri) { const string http = "http://"; const string https = "https://"; string prefix = string.Empty; if (uri.Contains(http)) { uri = uri.Replace(http, string.Empty); prefix = http; } else if (uri.Contains(https)) { uri = uri.Replace(https, string.Empty); prefix = https; } while (uri.Contains("//")) { uri = uri.Replace("//", "/"); } if (!string.IsNullOrEmpty(prefix)) { return prefix + uri; } return uri; } private bool UriHasRedundantSlashes(string uri) { const string http = "http://"; const string https = "https://"; if (uri.Contains(http)) { uri = uri.Replace(http, string.Empty); } else if (uri.Contains(https)) { uri = uri.Replace(https, string.Empty); } return uri.Contains("//"); } 

请参阅: https : //pro-papers.com/