Маршрут не найден для GET / - не может обслуживать index.html по умолчанию - PullRequest
0 голосов
/ 30 мая 2019

Я настроил несколько маршрутов для REST API, используя Grapevine, для небольшого веб-сервера в настольном приложении.API работает нормально, и другие статические файлы работают нормально, но я не могу заставить маршрутизатор направить пустой URL: http://:port/ в корневой файл index.html в указанной папке.

Веб - этопапка в пути exe, содержащая index.html и test.html.

Я могу обслуживать http://xxx:8080/test.html просто отлично.http://xxx:8080/ дает «Маршрут не найден для GET /»

Настройка веб-сервера:

        ServerSettings settings = new ServerSettings()
        {
            Host = "*",
            Port = "8080",
            PublicFolder = new PublicFolder("Web")                
        };

        server = new RestServer(settings);
        server.Start();

Маршруты:

    [RestResource]
    public class WebRequestHandler
    {
        [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "/api/v1/live")]
        public IHttpContext Live(IHttpContext context)
        {
            snip
            return context;
        }

        [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "/api/v1/cmd1/[id]")]
        public IHttpContext Cmd1(IHttpContext context)
        {
            return context;
        }

        [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "/api/v1/cmd2/[id]")]
        public IHttpContext Cmd2(IHttpContext context)
        {
            snip
            return context;
        }

        [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "/api/v1/cmd3/[id]")]
        public IHttpContext Cmd3(IHttpContext context)
        {
            snip
            return context;
        }


    }

index.html должен обслуживатьсякогда запрашивается корневой URL.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Это работает:

добавить маршрут, который обрабатывает '/', и вернуть файл вручную.

большое спасибо за вашу помощь. Теперь я могу использовать пакет Nuget и не беспокоиться о взломанной локальной копии библиотеки.

Фантастическая библиотека Кстати, я чуть не отказался от ее использования, потому что примеры и вики настолько скудны, что я ничего не мог понять. Очень рад, что я выстоял. Гораздо проще, чем все остальное, что я видел (после выяснения).

        [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "/")]
        public IHttpContext Root(IHttpContext context)
        {
            var filepath = Path.Combine(context.Server.PublicFolder.FolderPath, 
                                        context.Server.PublicFolder.IndexFileName); ;

            var lastModified = File.GetLastWriteTimeUtc(filepath).ToString("R");
            context.Response.AddHeader("Last-Modified", lastModified);

            if (context.Request.Headers.AllKeys.Contains("If-Modified-Since"))
            {
                if (context.Request.Headers["If-Modified-Since"].Equals(lastModified))
                {
                    context.Response.SendResponse(HttpStatusCode.NotModified);
                    return context;
                }
            }

            context.Response.ContentType = ContentType.DEFAULT.FromExtension(filepath);
            context.Response.SendResponse(new FileStream(filepath, FileMode.Open));

            return context;
        }
0 голосов
/ 03 июня 2019

Была ли такая же проблема с последним nuget 4.1.1?и github по состоянию на 31/5/19

Я изменил lib для этого изменения здесь:

protected void AddToDirectoryList(string fullPath)
        {
            DirectoryList[CreateDirectoryListKey(fullPath)] = fullPath;
            if (fullPath.EndsWith($"\\{_indexFileName}"))
            {
                DirectoryList[CreateDirectoryListKey(fullPath.Replace($"\\{_indexFileName}", ""))] = fullPath;
+++             DirectoryList["/"] = fullPath;
            }
        }
...