找不到 GET 的路由 / - 无法提供默认 index.html

Posted

技术标签:

【中文标题】找不到 GET 的路由 / - 无法提供默认 index.html【英文标题】:Route Not Found For GET / - Can't serve default index.html 【发布时间】:2019-10-15 20:18:11 【问题描述】:

我已经为使用 Grapevine 的 REST api 设置了几条路由,用于桌面应用程序中的小型网络服务器。 API 工作正常,其他静态文件工作正常,但我无法让路由器将空 url: http://:port/ 路由到指定文件夹中的根 index.html 文件。

web是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 时提供服务。

【问题讨论】:

显示你的rest api路由定义 添加了路由定义 您使用的是哪个版本的 Grapevine? @ScottOffen 4.1.1 nuget 和 githib 31/5/19 我发布了一个答案,我破解了一个解决方法。它似乎是chrome会将url作为'/'发送,并且直接列出的根文件夹的键为空。所以它不会匹配 '/' 到 index.html 【参考方案1】:

这行得通:

添加处理“/”的路由并手动返回文件。

非常感谢您的帮助。我现在可以使用 Nuget 包,而不必担心 lib 的本地副本被盗。

很棒的库顺便说一句,我几乎放弃使用它,因为示例和 wiki 太稀少了,我想不出任何东西。很庆幸我坚持下来了。比我看到的其他一切都简单得多(在弄清楚之后)。

        [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;
        

【讨论】:

是的,这种方式对我来说感觉很笨拙,所以我把它排除在我(现已删除)的答案之外。我确实需要完成文档。【参考方案2】:

最新的 nuget 4.1.1 也有同样的问题?和 github 截至 2019 年 5 月 31 日

我在此处修改了此更改的库:

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

【讨论】:

我删除了我的答案,因为它完全不准确(正如你所指出的)。如果您想提交问题,我可以添加一个可以处理此问题的功能。 谢谢,我会这样做,以便可以对其进行跟踪。感谢您的帮助。

以上是关于找不到 GET 的路由 / - 无法提供默认 index.html的主要内容,如果未能解决你的问题,请参考以下文章

使用命名路由导航时找不到流提供程序

在 laravel 7 路由中找不到句柄模块

登录时找不到“GET /”Symfony 的路由

Symfony2:找不到“GET /lucky/number”的路由

Phoenix - 找不到 GET /static/js/some.js 的路由

Laravel 5.1 找不到路由对象