URL-encodé slash dans l'URL

Ma Carte est:

routes.MapRoute(
   "Default",                                             //Route name
   "{controller}/{action}/{id}",                          //URL with params
   new { controller = "Home", action = "Index", id = "" } //Param defaults
);

Si j'utilise l'URL http://localhost:5000/Home/About/100%2f200 il n'y a pas d'itinéraire correspondant.
- Je modifier l'URL de http://localhost:5000/Home/About/100 puis la route est de nouveau mis en correspondance.

Est-il un moyen facile de travailler avec des paramètres qui contiennent des barres obliques? D'autres les valeurs d'échappement (espace %20) semblent fonctionner.

EDIT:

Pour encoder en Base64 fonctionne pour moi. Il rend l'URL laid, mais c'est OK pour l'instant.

public class UrlEncoder
{ 
public string URLDecode(string  decode)
{
if (decode == null) return null;
if (decode.StartsWith("="))
{
return FromBase64(decode.TrimStart('='));
}
else
{
return HttpUtility.UrlDecode( decode) ;
}
}
public string UrlEncode(string encode)
{
if (encode == null) return null;
string encoded = HttpUtility.PathEncode(encode);
if (encoded.Replace("%20", "") == encode.Replace(" ", ""))
{
return encoded;
}
else
{
return "=" + ToBase64(encode);
}
}
public string ToBase64(string encode)
{
Byte[] btByteArray = null;
UTF8Encoding encoding = new UTF8Encoding();
btByteArray = encoding.GetBytes(encode);
string sResult = System.Convert.ToBase64String(btByteArray, 0, btByteArray.Length);
sResult = sResult.Replace("+", "-").Replace("/", "_");
return sResult;
}
public string FromBase64(string decode)
{
decode = decode.Replace("-", "+").Replace("_", "/");
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetString(Convert.FromBase64String(decode));
}
}

EDIT1:

À la fin il s'est avéré que la meilleure façon était de sauver une jolie chaîne formatée pour chaque article que j'ai besoin de sélectionner. C'est beaucoup mieux, parce que maintenant, je ne coder les valeurs et jamais les décoder. Tous les caractères spéciaux deviennent des "-". Beaucoup de mes db-tables ont maintenant cette colonne supplémentaire "URL". Les données sont assez stables, c'est pourquoi je peux aller dans cette voie. Je peux même vérifier, si les données en "URL" est unique.

EDIT2:

Attention aussi à caractère espace. Il semble ok sur VS serveur web intégré, mais différent sur iis7 Correctement encoder caractère d'espace

  • Gath Adams recommande l'encodage Base64 sur tous les paramètres qui peuvent contenir des barres obliques. Il explique également la question plus en détail: l'entrée de Blog: gathadams.com/2009/01/06/...
  • Vous pouvez également venir avec d'autres façon de masquer la barre oblique, le dire, le remplacer par quelque chose d'autre par la convention. Je sais. C'est moche, mais au moins l'URL reste peu lisible.
  • J'ai remarqué que des barres obliques et les points me donner des erreurs. J'ai fait une rapide helper qui les remplace avec le "slash" et "points". Se demander pourquoi l'Url régulier.Encoder/Décoder de ne pas travailler sur quelque chose. Aussi, pourquoi un caractère d'échappement donner toutes les erreurs?
  • gathadams.com/2009/01/06/... donne un "404 - fichier non trouvé" erreur.
  • fonctionne à nouveau 🙂
  • Waouh, il y partenaire de! Le codage Base64 comprend le caractère de barre oblique trop! Ce n'est pas une solution, vous pouvez compter sur pour ce problème.
  • Ce n'est pas un problème de codage de routage; c'est apparemment un bug dans le .NET classe Uri. D'après ma lecture de] l'URI RFC, codée des barres obliques dans le chemin d'accès ne doivent pas être considérés comme des séparateurs de segment. MVC de Routage ne pas avoir une chance de l'obtenir, parce que la classe Uri (à tort) décode les barres obliques, avant de routage de même il voit. Voir la section 2.2 et 2.4 de la RFC. labs.apache.org/webarch/uri/rfc/rfc3986.html#reserved
  • Qu'advient-il si la chaîne d'origine contenait un "-" ou "_"?
  • Cela est correct. Je ne pense pas que.
  • Le personnage quand codé a une barre oblique?
  • comme mentionné dans l'url de la barre oblique est valable base64 caractère, de sorte que ce n'aide
  • Vous avez raison, comme l'a reconnu dans mon commentaire ci-dessus. L'OP ne doit pas avoir accepté cette réponse. Pour remédier à cela, la sortie de la vanille de l'encodage Base64 pourrait être résolu en remplaçant + et / avec - et _, respectivement (et de retour à nouveau à la fin de réception). C'est bien connu, une technique sécuritaire (l'alphabet Base64 lui-même ne contient pas de - et _) et une opération pas cher à qui. Cela signifie existant codeur bibliothèques peut encore être utilisé.

InformationsquelleAutor Mathias F | 2009-02-26