NancyFX Catch Весь маршрут
Поддерживает ли NancyFX ASP.NET MVC, например, "Catch All"? Мне нужен один, который в основном соответствует каждому URL-адресу. Это очень удобно для создания приложений с одной страницей.
Возможно ли это?
Ответы
Ответ 1
Да, используя Regex
Get[@"/(.*)"] = parameters => {
return View["viewname", parameters];
};
Но вам это действительно не нужно для создания приложения с одной страницей с помощью NancyFX. Вы можете просто использовать Get и Post со всей логикой маршрутизации и все еще иметь одностраничное приложение.
Ответ 2
Tested in Nancy version 0.23.2
Get[@"/(.*)"]
не работал у меня как общий путь. Маршруты "/" , "/foo/bar" , а более длинные маршруты не поймаются. Кажется, что нет необходимости определять маршрут Get["/"]
для корневого URL. Ничто другое, похоже, не поймает его (попробовал Get["{uri*}"]
). Здесь, как я определил свои маршруты (имейте в виду, что я делаю это для приложения Angular):
Get["/views/{uri*}"] = _ => { return "A partial view..."; };
Get["/"] =
Get["/{uri*}"] = _ =>
{
var uri = (string)_.uri;// The captured route
// If you're using OWIN, you can also get a reference to the captured route with:
var environment = this.Context.GetOwinEnvironment();// GetOwinEnvironment is in the 'Nancy.Owin' namespace
var requestPath = (string)environment["owin.RequestPath"];
return View["views/defaultLayout.html"];
};
Важно понимать Pattern Scoring. Шаблоны маршрутов взвешены, если два маршрута соответствуют одному и тому же сегменту URL, выигрыш выше. Шаблон catch-all взвешен 0
, и хотя шаблон маршрута /views/{uri*}
также является общим для всех, он начинается с литерала, который взвешен 10000
, поэтому он будет выигрывать на всех маршрутах, которые начинаются с/вид.
Подробнее о Доступ к переменным окружения Owin. Обратите внимание, что захваченная переменная uri
и requestPath
будет немного отличаться. requestPath
начнется с /
, где переменная uri
не будет. Кроме того, если шаблон сопоставленного маршрута Get["/"]
, uri
будет null
, а requestPath
будет "/"
.
Маршрут Views возвращает частичный html файл, основанный на пути URL-адреса, и все остальные маршруты возвращают страницу макета по умолчанию, которая будет загружать SPA.
Ответ 3
Обновленный ответ, для которого решение @synhershko не работает. Попробуйте:
Get[@"^(.*)$"] = parameters => {
return "hi";
};
Это приведет к захвату всех путей, за исключением индексной страницы. Я не уверен, что это будет работать в контексте Angular, но это сработало для меня при попытке взломать простой сервер только с одним обработчиком.
Ответ 4
Ответ, предоставленный @synhershko, не работает для меня. Он не обрабатывает /users/ 2 или любой другой маршрут, содержащий больше сегментов.
Ниже мой код работает на моей машине;):
public class IndexModule : NancyModule
{
dynamic IndexPage() { return View["Index"]; }
public IndexModule()
{
Get["/"] = _ => { return IndexPage(); };
Get["/(.*)"] = _ => { return IndexPage(); };
Get["/(.*)/(.*)"] = _ => { return IndexPage(); };
Get["/(.*)/(.*)/(.*)"] = _ => { return IndexPage(); };
}
}
Мое решение не идеально, потому что оно не соответствует всем. Я повторил так много "/(.*)", как в моем самом длинном Angular маршруте.