2017-02-23 115 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」);'。 –