URLs con barra en el parámetro?

Pregunta:

Estoy creando un software wiki, básicamente un clon de wikipedia / mediawiki, pero en ASP.NET MVC (el MVC es el punto, así que no me recomiendes ScrewTurn).

Ahora tengo una pregunta:

Uso este mapeo de ruta para enrutar una URL como:
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 ); 

Ahora me acaba de ocurrir que podría haber títulos como ‘AS / 400’:
http://en.wikipedia.org/wiki/AS/400

Incidentalmente, también está este (título ‘Slash’):
http://en.wikipedia.org/wiki//

Y éste:
http://en.wikipedia.org/wiki//dev/null

En general, Wikipedia parece tener una lista de títulos interesantes como este: http://en.wikipedia.org/wiki/Wikipedia:Articles_with_slashes_in_title

¿Cómo hago rutas como esta ruta correctamente?

Editar:
Algo como:
Si la URL comienza con / Wiki /, y si no comienza con / wiki / Edit / (pero no / Wiki / Edit), pase todo el rest de la URL como Id.

Editar:
Hmm, solo otro problema: ¿cómo puedo enrutar este:
http://en.wikipedia.org/wiki/C&A

Wikipedia puede …

Editar:
Según wikipedia, debido a los choques con la syntax de wikitext, solo los siguientes caracteres nunca se pueden usar en los títulos de las páginas (ni son compatibles con DISPLAYTITLE):

 #  [ ] | { } 

http://en.wikipedia.org/wiki/Wikipedia:Naming_conventions_(technical_restrictions)#Forbidden_characters

Editar:
Para permitir * y &, poner

  

en la sección en el archivo web.config

(Encontrado aquí: http://www.christophercrooker.com/use-any-characters-you-want-in-your-urls-with-aspnet-4-and-iis )

Puede usar una ruta de captura para capturar todo lo que sigue a la parte wiki de la url en el token de identidad:

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

Ahora si tiene la siguiente solicitud: /wiki/AS/400 se asignará a la siguiente acción en el controlador Wiki :

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

En lo que respecta a /wiki// , creo que obtendrás un error de 400 solicitudes erróneas del servidor web antes de que esta solicitud llegue alguna vez a la interconexión de ASP.NET. Puede consultar la siguiente publicación de blog .

@Darin: Bueno, eso es obvio, la pregunta es: ¿por qué? se dan el controlador + acción + identificación, es como si estuviese pasando todos estos al enrutamiento de nuevo … – Quandary 13 de junio de11 a 17:38

Quandry: tal vez ya se haya dado cuenta de esto porque su pregunta tiene más de un año, pero cuando llama a RedirectToAction, en realidad está enviando una respuesta HTTP 302 al navegador, lo que hace que el navegador haga una solicitud GET a la acción especificada. Por lo tanto, el bucle infinito que está viendo.

Ver: método Controller.RedirectToAction

en Attribute Routing en mvc tuve el mismo problema al tener / in string abc/cde en HttpGet

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

entonces debes colocar * porque después de esto se considerará como parámetro

Todavía como una opción, escriba en el archivo 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("//"); }