ASP.net核心MVC捕捉所有路径服务静态文件
有没有办法让所有路径服务静态文件?在此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
如果你已经在路由阶段,您已经超过了在管道中提供静态文件的地步。你的启动看起来像这样:
app.UseStaticFiles();
...
app.UseMvc(...);
这里的顺序很重要。因此,您的应用程序将首先查找静态文件,这从性能角度来看是有意义的 - 如果您只想抛出静态文件,则无需运行MVC管道。
您可以创建一个全部控制器操作,它将返回文件的内容。例如(偷你评论中的代码):
public IActionResult Spa()
{
return File("~/index.html", "text/html");
}
哪个'File'类是你正在使用的?它不可能是'System.IO.FileSystem.File'。找不到合适的匹配项。 – Marcus
@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
我是一个笨蛋,忘了从'Controller'继承,这就是为什么我看不到它。谢谢! – Marcus
我不得不对@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");
}
}
我使用的是什么行之有效的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
=> 404NotFound()
从HomeController.ApiNotFound
返回在很多情况下你会想要一个独立项目中的API,但这是一个可行的选择。
为了从wwwroot
文件夹中提供index.html
文件夹,应该添加以下指令(.Net Core 2)。
这允许提供静态文件:
app.UseStaticFiles();
这使得到默认的文件,例如index.html
:
app.UseDefaultFiles();
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" });
});
太棒了!我使用了你的第一个解决方案,虽然我在你的逻辑之前放置了UseStaticFiles,所以静态文件将首先被提供,而我不需要UseDefaultFiles。更重要的是,我必须将路径设置为'context.Request.Path =“/”;'并且在我的HomeController的Index操作中,服务'File(“〜/ index.html”,“text/html”);'。 –
如果你已经在路由元素中,你已经超过了p oint在管道中提供静态文件的位置。您可以创建一个全部控制器操作,它将返回文件的内容。 – DavidG
有没有推荐的方法呢? – Mardoxx
据我所知不是。 – DavidG