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 маршруте.