2017-02-23 119 views
4

有没有办法让所有路径服务静态文件?在此http://blog.nbellocam.me/2016/03/21/routing-angular-2-asp-net-core/ASP.net核心MVC捕捉所有路径服务静态文件

找我基本上想是这样的:

 app.UseMvc(routes => 
     { 
      routes.MapRoute("default", "{controller}/{action=Index}"); 

      routes.MapRoute("spa", "{*url}"); // This should serve SPA index.html 
     }); 

所以不匹配的MVC控制器的任何路线将成为了wwwroot/index.html

+2

如果你已经在路由元素中,你已经超过了p oint在管道中提供静态文件的位置。您可以创建一个全部控制器操作,它将返回文件的内容。 – DavidG

+0

有没有推荐的方法呢? – Mardoxx

+0

据我所知不是。 – DavidG

回答

8

如果你已经在路由阶段,您已经超过了在管道中提供静态文件的地步。你的启动看起来像这样:

app.UseStaticFiles(); 

... 

app.UseMvc(...); 

这里的顺序很重要。因此,您的应用程序将首先查找静态文件,这从性能角度来看是有意义的 - 如果您只想抛出静态文件,则无需运行MVC管道。

您可以创建一个全部控制器操作,它将返回文件的内容。例如(偷你评论中的代码):

public IActionResult Spa() 
{ 
    return File("~/index.html", "text/html"); 
} 
+0

哪个'File'类是你正在使用的?它不可能是'System.IO.FileSystem.File'。找不到合适的匹配项。 – Marcus

+1

@Marcus它不是一个文件类,它是['File'](https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.aspnetcore.mvc.controllerbase#Microsoft_AspNetCore_Mvc_ControllerBase_File_System_String_System_String_)方法的控制器类。 – DavidG

+0

我是一个笨蛋,忘了从'Controller'继承,这就是为什么我看不到它。谢谢! – Marcus

17

我不得不对@DavidG做一些补充答案。以下是我结束了

Startup.cs

app.UseStaticFiles(); 

app.UseMvc(routes => 
{ 
    routes.MapRoute("default", "{controller}/{action}"); 

    routes.MapRoute("Spa", "{*url}", defaults: new { controller = "Home", action = "Spa" }); 
}); 

HomeController.cs

public class HomeController : Controller 
{ 
    public IActionResult Spa() 
    { 
     return File("~/index.html", "text/html"); 
    } 
} 
1

我使用的是什么行之有效的Microsoft.AspNetCore.Builder.SpaRouteExtensions.MapSpaFallbackRoute

app.UseMvc(routes => 
{ 
    // Default route for SPA components, excluding paths which appear to be static files (have an extension) 
    routes.MapSpaFallbackRoute(
     "spaFallback", 
     new { controller = "Home", action = "Index" }); 
}); 

HomeController.Index与您的index.html相当。你也可以路由到一个静态页面。

有点偏离主题,但如果你也有在同一项目中的API的api文件夹下,你可以为任何API路由的默认404响应不匹配:

routes.MapRoute(
    "apiDefault", 
    "api/{*url}", 
    new { controller = "Home", action = "ApiNotFound" }); 

你会结束与以下行为:

  • /controller =>没有延长,所以从HomeController.Index服务SPA默认页面,让SPA处理路由
  • /file.txt =>扩展检测,提供静态文件
  • /api/controller =>适当的API响应(使用属性路由或设置另一个地图的API控制器)
  • /api/non-existent-route => 404 NotFound()HomeController.ApiNotFound

返回在很多情况下你会想要一个独立项目中的API,但这是一个可行的选择。

0

为了从wwwroot文件夹中提供index.html文件夹,应该添加以下指令(.Net Core 2)。

这允许提供静态文件:

app.UseStaticFiles(); 

这使得到默认的文件,例如index.html

app.UseDefaultFiles(); 
6

ASP.NET核心捉对Web API和MVC所有路由配置不同

随着Web API(if you're using prefix "api" for all server-side controllers eg. Route("api/[controller"]):

app.Use(async (context, next) => 
{ 
    await next(); 
    var path = context.Request.Path.Value; 

    if (!path.StartsWith("/api") && !Path.HasExtension(path)) 
    { 
     context.Request.Path = "/index.html"; 
     await next(); 
    } 
});    

app.UseDefaultFiles(); 
app.UseStaticFiles(); 

app.UseMvc(); 

随着MVC(dotnet add package Microsoft.AspNetCore.SpaServices -Version x.y.z):

app.UseDefaultFiles(); 
app.UseStaticFiles(); 

app.UseMvc(routes => 
{ 
    routes.MapRoute( 
     name: "default", 
     template: "{controller=Home}/{action=Index}"); 

    routes.MapSpaFallbackRoute("spa", new { controller = "Home", action = "Index" }); 
}); 
+1

太棒了!我使用了你的第一个解决方案,虽然我在你的逻辑之前放置了UseStaticFiles,所以静态文件将首先被提供,而我不需要UseDefaultFiles。更重要的是,我必须将路径设置为'context.Request.Path =“/”;'并且在我的HomeController的Index操作中,服务'File(“〜/ index.html”,“text/html”);'。 –