Расширение механизма маршрутизации Asp.Net MVC - PullRequest
3 голосов
/ 03 июня 2009

Я нашел ограничение в механизме маршрутизации для ASP.Net mvc, и я пытаюсь найти обходной путь.

Я опубликовал соответствующий вопрос здесь о проблеме, которая возникла у меня.

Суть проблемы в том, что маршруты, заканчивающиеся на. (точка) никогда не обрабатываются механизмом маршрутизации по умолчанию. Всегда выдается ошибка «Ресурс не найден». Например, он не может обрабатывать эти URL:

http://www.wikipediamaze.com/wiki/Washington,_D.C.
http://www.wikipediamaze.com/wiki/anythingendinglikethis.

если я изменю его на параметр querystring, он будет работать нормально:

http://www.wikipediamaze.com/wiki/?topic=Washington,_D.C.

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

//Global.asax.cs
protected void Application_Error()
{
     var url = HttpContext.Current.Request.RawUrl;
     if(TopicRegex.IsMatch(url))
     {
         var fixedUrl = FixUrlPath(url);

         //This throws an error
         Response.Redirect(fixedUrl);

         //This also throws an error
         Server.Transfer(fixedUrl );
      }
}

Я предполагаю, что Response.Redirect и Server.Transfer выдают ошибки, потому что в MVC вы должны вызывать методы RedirectToAction из контроллера. Конечно, я не могу даже добраться до контроллера.

Это, кажется, довольно большое ограничение, учитывая, что сервер Apache, который использует Википедия, прекрасно справляется с этим. попробуйте http://en.wikipedia.org/wiki/Washington,_D.C. Если кто-нибудь может предложить какую-то помощь здесь, я был бы признателен.

1 Ответ

1 голос
/ 08 июня 2009

Не могли бы вы проверить, существует ли файл в маршрутах, но разрешить определенные расширения через?

routes.RouteExistingFiles = true;

// Ignore the assets directory which contains images, js, css & html
routes.IgnoreRoute("Assets/{*pathInfo}");

// Ignore text, html, files.
routes.IgnoreRoute("{file}.txt");
routes.IgnoreRoute("{file}.htm");
routes.IgnoreRoute("{file}.html");
routes.IgnoreRoute("{file}.aspx");
...