.NET Core 2无需MVC进行路由

4
我正在尝试创建一个简单的 .Net Core 2 应用程序,其中包含 Angular 前端和 api/db 后端。我不想使用 MVC,因为我没有typical dot net 视图或模型的需求,但我在处理index.html文件和路由api调用到控制器方面遇到了问题。
我知道它在program.cs中某个地方,并涉及路由,但我一直很难找到如何在不使用mvc包的情况下做到我想要的事情的文档。
简单来说,这里是我的要求:
1.当路由到根目录时,提供我的angular index.html文件(让angular处理其他路由)。 2.将我的/api路由路由到C# dot net控制器。 3.不使用MVC。
谢谢!

1
在.NET Core 2.0中,Web API和MVC已经合并为一个称为MVC的单一框架。因此,如果您想添加API路由,则实际上是在寻找MVC。 - NightOwl888
我明白。你能否给我提供一个如何仅提供HTML文件的示例呢?例如,为了提供我的Angular应用程序,我不想路由到控制器操作并返回视图。我不需要控制器操作,对吧? - blubberbo
1
我相信你所需的一切只是 app.UseStaticFiles() - NightOwl888
但是路由代码是什么,才能让像「...com/」和「...com/about/」这样的路由提供index.html文件,并将路由传递到Angular路由器中呢? - blubberbo
2个回答

6
你可以使用UseRouter()中间件来直接映射路由作为应用程序配置流程的一部分。
例如,以下代码创建一个自定义路由来处理Lets Encrypt请求,默认情况下如果启用了其他任何路由,则会失败。以下代码放入服务器的Startup类的Configure()方法中:
        // Handle Lets Encrypt Route(before MVC processing!)
        app.UseRouter(r =>
        {
            r.MapGet(".well-known/acme-challenge/{id}", async (request, response, routeData) =>
            {
                var id = routeData.Values["id"] as string;
                var file = Path.Combine(env.WebRootPath, ".well-known", "acme-challenge", id);
                await response.SendFileAsync(file);
            });
        });

这基本上使得简单路由场景或将请求转发到其他处理程序非常容易。
请注意,这是一个原始接口,除了原始的请求/响应语义之外,它不包括任何输入或输出处理。
如果您正在处理API风格的数据,则仍建议使用MVC和控制器来处理各种您需要自己构建的东西。在Core中,API和MVC运行相同的控制器管道,因此您可以将MVC视为Web API和MVC的组合。
对于大多数常见用例,使用MVC仍然是最好的选择。上述方法非常适用于微服务或一次性请求,因为这可能会为您带来一点性能提升,因为它不必加载任何MVC位或进入该管道,但您需要负责自己的序列化和请求处理。

那我还是应该使用控制器方法,通过它返回我的index.html,对吗? - blubberbo
对于 index.html 和类似的项目,请使用 StaticFile 中间件。它将处理一定程度的缓存,并正确处理内容类型和过期时间。 - Rick Strahl

1
作为替代方案,您可以始终使用.AddMvcCore()来激活MVC,并使用.AddJsonFormatters()打开JSON格式化程序(假设您的API将是JSON)。
在这种情况下,您将从ControllerBase继承而不是Controller
只要启用了静态文件,您就可以将index.html放置在Web根目录(wwwroot)的顶层,并将其作为默认文档提供。您的Angular应用程序将接管后端构建的API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接