ASP.NET Перехват всех маршрутов и экранирование косой черты

Я использую всеобъемлющую маршрутизацию с MVC, чтобы указать путь к ресурсу в нашем приложении. Выглядит так:

_routes.MapRoute(null, "Resource/{*resourcePath}", new { 
    controller = "Resource", 
    action = "Open" 
});

И действие примерно такое

public ActionResult Open(string resourcePath) {
    string[] path = resourcePath.Split('/');
}

Нажав на него с красивым и дружественным URL-адресом, он отлично работает.

/Resource/Path/To/Resource  
    path = ["Path", "To", "Resource"]

Но когда у меня есть имя ресурса с косой чертой в нем (которую я, конечно же, экранирую), он рассматривает экранированную косую черту как часть пути.

/Resource/Path/To/Resource%2FWith%2FSlashes  
    path = ["Path", "To", "Resource", "With", "Slashes"]
    I expected ["Path", "To", "Resource/With/Slashes"]

Я попытался выполнить двойное экранирование только для того, чтобы ASP.NET пожаловался на двойное экранирование из соображений безопасности, и я не думаю, что мне следует открывать эту банку с червями.

Есть ли способ сделать так, чтобы универсальный маршрут не удалял косую черту?


person XwipeoutX    schedule 31.10.2013    source источник
comment
Я думаю, вам придется использовать другую кодировку для косой черты, которая не является частью пути. Например, используйте двойную косую черту, а затем соедините разделенные части результата, разделенные пустым элементом. Только случайные мысли...   -  person jbl    schedule 31.10.2013
comment
Я думаю, что IIS - это один из декодирующих URL-адресов.   -  person LostInComputer    schedule 31.10.2013
comment
Похоже, что экранирование путем удвоения тоже не работает, URL-адрес с /Path/To/Resource//With//Double//Slashes меняется на /Path/To/Resource/With/Doubled/Slashes к моменту поступления запроса ASP.NET, но думаю идея сработает и с каким-нибудь другим персонажем   -  person XwipeoutX    schedule 06.11.2013