Подтвердить что ты не робот

Почему конечный %20 (допустимые данные в этом случае) убивает asp.net mvc routing

Возьмите следующее действие контроллера

    public ActionResult NextBySURNAME(int id, string data)
    {
        //code to process the data and edit the id accoringly not written yet
        return RedirectToAction("Edit", new { id = id });
    }

если я назову его /Mycontroller/NextBySURNAME/ 12/Smith %20Simon

тогда он отлично работает (в этом случае запись редактирования 12) но

/Mycontroller/NextBySURNAME/12/20% Смит

дает мне 404

Теперь я знаю, что в некоторых случаях в моей проблемной области существенное значение имеет пробел в хвосте, поэтому я не просто хочу его обрезать. Итак, почему это нарушает мой маршрут?

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}/{data}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional, data=UrlParameter.Optional } // Parameter defaults
        );
4b9b3361

Ответ 1

Итак, я сделал некоторую отладку маршрута и обнаружил, что маршруты, которые заканчиваются пробелом, даже не оценивались моим приложением MVC. Поэтому IIS должен плохо обрабатывать эти запросы.

Я добавил правило перезаписи в IIS 7.5, чтобы сопоставить конечные пробелы и переписать их как один и тот же URL-адрес без пробела. Я не удовлетворен этим решением, но не смог найти объяснения о том, почему IIS неправильно обрабатывает URL-адреса с завершающими пробелами.

Ответ 2

Я думаю, что способ, которым избегали символы, обрабатывается, изменен в .NEt 4.0, но я не пробовал это сам. См. http://msdn.microsoft.com/en-us/library/system.uri.aspx.

Эндрюс отвечает на косую черту в URL-адресе

Также Как создать экземпляр Uri, обработанный с помощью GenericUriParserOptions.DontCompressPath

Это все только дикие предположения, но, возможно, это помогает.